GeneralCatalog
3.2.92
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 3.3.0 beta2.
Build for OTRS::ITSM 3.3.0 beta1.
The General Catalog package.
Das General Catalog Paket.
El paquete General Catalog.
3.3.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."
);
}
}
2013-09-06 08:03:42
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=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkZyYW1ld29yayI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5HZW5lcmFsQ2F0YWxvZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+R2VuZXJhbCBDYXRhbG9nPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+R2VuZXJhbCBDYXRhbG9nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+VGlja2V0PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40MTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjQ29tbWVudDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5HZW5lcmFsQ2F0YWxvZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiPkNvbW1lbnQyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIj5EZWZpbmUgdGhlIGdlbmVyYWwgY2F0YWxvZyBjb21tZW50IDIuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGV4dEFyZWE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHMiPjUwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSb3dzIj41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5QZXJtaXNzaW9uczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyI+RGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPlBlcm1pc3Npb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsYXNzIj5JVFNNOjpDb25maWdJdGVtOjpDbGFzczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+UGVybWlzc2lvbnM8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICfQpNGD0L3QutGG0LjQvtC90LDQu9C90L7RgdGCJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9C10L3QuNC1INC90LAg0L7RgdC90L7QstC90LjRjyDQutCw0YLQsNC70L7Qsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAn0JTQvtCx0LDQstC4INC10LvQtdC80LXQvdGCINC60YrQvCDQutCw0YLQsNC70L7Qs9CwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAn0JTQvtCx0LDQstC4INC60LvQsNGBINCyINC60LDRgtCw0LvQvtCz0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ9Ca0LvQsNGB0L7QstC1INCyINC60LDRgtCw0LvQvtCz0LAnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ9Ce0YHQvdC+0LLQtdC9INC60LDRgtCw0LvQvtCzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmNzX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5rY2lvbmFsaXRhJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ1NwcsOhdmEgSGxhdm7DrWhvIEthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdQw7hpZGF0IFBvbG/FuGt1IEthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnUMO4aWRhdCBUw7jDrWR1IEthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdUw7jDrWR5IEthdGFsb2d1JzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdIbGF2bsOtIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5jaW9uYWxpdGF0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7MgZGVsIGNhdMOgbGVnIGdlbmVyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0FmZWdpciBhcnRpY2xlIGRlIGNhdMOgbGVnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnQWZlZ2lyIGNsYXNzZSBkZSBjYXTDoGxlZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRlIGNhdMOhbGVnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F0w6BsZWcgZ2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5rdGlvbmFsaXRldCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIEthdGFsb2cgTWFuYWdlbWVudCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnVGlsZsO4aiBrYXRhbG9nIHBvc3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdUaWxmw7hqIEthdGFsb2cga2xhc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLYXRhbG9nIEtsYXNzZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnR2VuZXJhbCBLYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5rdGlvbmFsaXTDpHQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VuZXJhbC1LYXRhbG9nLVZlcndhbHR1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0thdGFsb2ctRWludHJhZyBoaW56dWbDvGdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2ctS2xhc3NlIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLYXRhbG9nLUtsYXNzZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnR2VuZXJhbC1LYXRhbG9nIGVyc3RlbGxlbiB1bmQgdmVyd2FsdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnRnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluR2VuZXJhbENhdGFsb2cgS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdHZW5lcmFsLUthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciBmw7xyIGRlbiBCZWlzcGllbC1Lb21tZW50YXIgMiBkZXIgR2VuZXJhbC1LYXRhbG9nLUF0dHJpYnV0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldGVyIGbDvHIgZGllIHp1Z3JpZmZzYmVyZWNodGlndGUgR3J1cHBlIGRlciBHZW5lcmFsLUthdGFsb2ctQXR0cmlidXRlLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBOYW1lISd9ID0gJ0VpbmUgS2F0YWxvZy1LbGFzc2UgYmVuw7Z0aWd0IGVpbmVuIE5hbWVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiEnfSA9ICdFaW5lIEdlbmVyYWwtS2F0YWxvZy1LbGFzc2UgYmVuw7Z0aWd0IGVpbmUgQmVzY2hlcmVpYnVuZyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyBpcyByZXF1aXJlZC4nfSA9ICdLYXRhbG9nLUtsYXNzZSBpc3QgZXJmb3JkZXJsaWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkLid9ID0gJ0RlciBOYW1lIGlzdCBlcmZvcmRlcmxpY2guJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5jaW9uYWxpZGFkJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlbCBDYXTDoWxvZ28gR2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnQcOxYWRpciBFbGVtZW50byBhbCBDYXTDoWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBw7FhZGlyIENsYXNlIGFsIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc2UgZGUgQ2F0w6Fsb2dvJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXTDoWxvZ28gR2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyw6FtZXRyb3MgcGFyYSBlbCBlamVtcGxvIGNvbWVudGFyaW8gMiBkZSBsb3MgYXRyaWJ1dG9zIGRlbCBjYXTDoWxvZ28gZ2VuZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyw6FtZXRyb3MgcGFyYSBsb3MgcGVybWlzb3MgZGUgZWplbXBsbyBkZSBsb3MgYXRyaWJ1dG9zIGRlbCBjYXTDoWxvZ28gZ2VuZXJhbC4nOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZhX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICfaqdin2LHaqdix2K/bjCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfZhdiv24zYsduM2Kog2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfYp9i22KfZgdmHINqp2LHYr9mGINuM2qkg2YLZhNmFINmB2YfYsdiz2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfYp9i22KfZgdmHINqp2LHYr9mGINqp2YTYp9izINmB2YfYsdiz2KrbjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn2YHZh9ix2LPYqiDaqdmE2KfYs9uMJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICfYs9in2K7YqiDZiCDZhdiv24zYsduM2Kog2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICfYq9io2Kog2YXYp9qY2YjZhCDYqNix2KfbjCDZvtuM2qnYsdio2YbYr9uMINmB2YfYsdiz2Kog2LnZhdmI2YXbjCDYr9ixINio2K7YtCDZhdiv24zYsduM2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICfZvtin2LHYp9mF2KrYsdmH2KfbjNuMINio2LHYp9uMINiq2YjYttuM2K0g2YbZhdmI2YbZhyDbsiDZhdix2KjZiNi3INio2Ycg2YjbjNqY2q/bjOKAjNmH2KfbjCDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAn2b7Yp9ix2KfZhdiq2LHZh9in24zbjCDYqNix2KfbjCDar9ix2YjZh+KAjNmH2KfbjCDYr9iz2KrYsdiz24wg2YbZhdmI2YbZhyDZhdix2KjZiNi3INio2Ycg2YjbjNqY2q/bjOKAjNmH2KfbjCDZgdmH2LHYs9iqINi52YXZiNmF24wnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGb25jdGlvbm5hbGl0w6knOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbiBkdSBDYXRhbG9ndWUgR8OpbsOpcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBam91dGVyIHVuIEVsZW1lbnQgYXUgQ2F0YWxvZ3VlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnQWpvdXRlciB1bmUgQ2xhc3NlIGRlIENhdGFsb2d1ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRlIENhdGFsb2d1ZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F0YWxvZ3VlIEfDqW7DqXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW56aW9uYWxpdMOgJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpb25lIGRlbCBDYXRhbG9nbyBHZW5lcmFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnQWdnaXVuZ2kgRWxlbWVudG8gYWwgQ2F0YWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZ2dpdW5naSBDbGFzc2UgYWwgQ2F0YWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0NsYXNzZSBkaSBDYXRhbG9nbyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F0YWxvZ28gR2VuZXJhbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9qYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn5LiA6Iis44Kr44K/44Ot44Kw566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfjgqvjgr/jg63jgrDpoIXnm67jgpLov73liqAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfjgqvjgr/jg63jgrDjgq/jg6njgrnjgpLov73liqAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9tc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om1zX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5nc2knOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnS2F0YWxvZyBQZW5ndXJ1c2FuIEdlbmVyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ1RhbWJhaGFuIEl0ZW0gS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ1RhbWJhaCBLZWxhcyBLYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLZWxhcyBLYXRhbG9nJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdDaXB0YSBkYW4gdXJ1cyBLYXRhbG9nIEdlbmVyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnS2F0YWxvZyBHZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIE5hbWUhJ30gPSAnS2VsYXMga2F0YWxvZyBwZXJsdSBtZW1wdW55YWkgbmFtYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgZGVzY3JpcHRpb24hJ30gPSAnS2VsYXMga2F0YWxvZyBwZXJsdSBtZW1wdW55YWkgcGVuamVsYXNhbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyBpcyByZXF1aXJlZC4nfSA9ICdLZWxhcyBrYXRhbG9nIGFkYWxhaCBkaXBlcmx1a2FuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkLid9ID0gJ05hbWEgZGlwZXJsdWthbi4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9uYl9OT19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5rc2pvbmFsaXRldCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdBZG1pbmlzdHJhc2pvbiBhdiBHZW5lcmVsbCBLYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdMZWdnIHRpbCBrYXRhbG9nb2JqZWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnTGVnZyB0aWwga2F0YWxvZy1rbGFzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2cta2xhc3NlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdPcHByZXR0IG9nIGFkbWluaXN0csOpciBkZW4gZ2VuZXJlbGxlIGthdGFsb2dlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnRm9yc2lkZW1vZHVsLXJlZ2lzdHJlcmluZyBmb3IgQWRtaW5HZW5lcmFsQ2F0YWxvZy1vcHBzZXR0IGkgYWRtaW4tZGVsZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0dlbmVyZWxsIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyZSBmb3IgZWtzZW1wZWxrb21tZW50YXIgMiBpIGF0dHJpYnV0dGVuZSBmb3IgZ2VuZXJlbGwga2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0ZXJlIGZvciB0aWxnYW5nc2dydXBwZS1la3NlbXBlbCBpIGF0dHJpYnV0dGVuZSBmb3IgZ2VuZXJlbGwga2F0YWxvZy4nOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgTmFtZSEnfSA9ICdFbiBrYXRhbG9na2xhc3NlIG3DpSBoYSBldCBuYXZuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIGRlc2NyaXB0aW9uISd9ID0gJ0VuIGthdGFsb2cta2xhc3NlIG3DpSBoYSBlbiBiZXNrcml2ZWxzZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyBpcyByZXF1aXJlZC4nfSA9ICdLYXRhbG9na2xhc3NlIGVyIHDDpWtyZXZkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkLid9ID0gJ05hdm4gZXIgcMOla3JldmQuJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5sX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5jdGlvbmFsaXRlaXQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnQ2F0YWxvZ3VzIEJlaGVlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnQ2F0YWxvZ3VzLWl0ZW0gdG9ldm9lZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnQ2F0YWxvZ3VzLWtsYXNzZSB0b2V2b2VnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0NhdGFsb2d1cyBrbGFzc2UnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ0Fhbm1ha2VuIGVuIGJlaGVyZW4gdmFuIGl0ZW1zIGluIGRlIGNhdGFsb2d1cy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXRhbG9ndXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5rY2pvbmFsbm/Fm8SHJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ1phcnrEhWR6YW5pZSBrYXRhbG9naWVtIGfFgsOzd255bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnRG9kYWogZWxlbWVudCBrYXRhbG9ndSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ0RvZGFqIGtsYXPEmSBrYXRhbG9ndSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnS2xhc2Ega2F0YWxvZ3UnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ1V0d8OzcnogaSB6YXJ6xIVkemFqIGthdGFsb2dpZW0gZ8WCw7N3bnltLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnUmVqZXN0cmFjamEgbW9kdcWCdSBmcm9udGVuZCBkbyBrb25maWd1cmFjamkgbW9kdcWCdSBBZG1pbkdlbmVyYWxDYXRhbG9nIHcgcGFuZWx1IGFkbWluaXN0cmF0b3JhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdLYXRhbG9nIGfFgsOzd255JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0cnkgZG8gcHJ6eWvFgmFkb3dlZ28ga29tZW50YXJ6YSAyIGF0cnlidXTDs3cga2F0YWxvZ3UgZ2VuZXJhbG5lZ28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyeSBkbGEgcHJ6eWvFgmFkb3d5Y2ggZ3J1cCB1cHJhd25pZcWEIGF0cnlidXTDs3cga2F0YWxvZ3UgZ8WCw7N3bmVnby4nOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgTmFtZSEnfSA9ICdLbGFzYSBrYXRhbG9ndSBwb3dpbm5hIG1pZcSHIG5henfEmSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgZGVzY3JpcHRpb24hJ30gPSAnS2xhc2Ega2F0YWxvZ3UgcG93aW5uYSBtaWXEhyBvcGlzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0tsYXNhIGthdGFsb2d1IGplc3Qgd3ltYWdhbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQuJ30gPSAnTmF6d2EgamVzdCB3eW1hZ2FuYS4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5jaW9uYWxpZGFkZSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXJlbmNpYW1lbnRvIGRvIENhdMOhbG9nbyBHZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnQWRpY2lvbmFyIEl0ZW0gYW8gQ2F0w6Fsb2dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnQWRpY2lvbmFyIENsYXNzZSBhbyBDYXTDoWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0NsYXNzZSBkbyBDYXTDoWxvZ28nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIG8gQ2F0w6Fsb2dvIEdlcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnTcOzZHVsbyBkZSByZWdpc3RvIGRhIGludGVyZmFjZSBwYXJhIGEgY29uZmlndXJhw6fDo28gQWRtaW5HZW5lcmFsQ2F0YWxvZyBuYSDDoXJlYSBhZG1pbmlzdHJhdGl2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F0w6Fsb2dvIEdlcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDom1ldHJvcyBwYXJhIG8gY29tZW50w6FyaW8gZGUgZXhlbXBsbyAyIGRvcyBhdHJpYnV0b3MgZG8gY2F0w6Fsb2dvIGdlcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDom1ldHJvcyBwYXJhIG9zIGdydXBvcyBkZSBwZXJtaXNzw6NvIGRlIGV4ZW1wbG8gZG9zIGF0cmlidXRvcyBkbyBjYXTDoWxvZ28gZ2VyYWwuJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIE5hbWUhJ30gPSAnVW1hIENsYXNzZSBkZSBDYXTDoWxvZ28gZGV2ZSB0ZXIgdW0gbm9tZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgZGVzY3JpcHRpb24hJ30gPSAnVW1hIENsYXNzZSBkZSBDYXTDoWxvZ28gZGV2ZSB0ZXIgdW1hIGRlc2NyacOnw6NvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0EgQ2xhc3NlIGRlIENhdMOhbG9nbyDDqSBvYnJpZ2F0w7NyaWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQuJ30gPSAnTyBub21lIMOpIG9icmlnYXTDs3Jpby4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9QVF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDEyIEZDQ04gLSBSdWkgRnJhbmNpc2NvIDxydWkuZnJhbmNpc2NvQGZjY24ucHQ+CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X1BUX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5jaW9uYWxBbnRpZ3VpZGFkZSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0w6NvIGRvIENhdMOhbG9nbyBHZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnQWRpY2lvbmFyIEl0ZW0gYW8gQ2F0w6Fsb2dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnQWRpY2lvbmFyIENsYXNzZSBhbyBDYXTDoWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0NsYXNzZSBkbyBDYXTDoWxvZ28nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ0NyaWFyIGUgZ2VyaXIgbyBDYXTDoWxvZ28gR2VyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPSAnTcOzZHVsbyBkZSByZWdpc3RvIGRhIGludGVyZmFjZSBwYXJhIGEgY29uZmlndXJhw6fDo28gQWRtaW5HZW5lcmFsQ2F0YWxvZyBuYSDDoXJlYSBhZG1pbmlzdHJhdGl2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F0w6Fsb2dvIEdlcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnUGFyw6JtZXRyb3MgcGFyYSBvIGNvbWVudMOhcmlvIGRlIGV4ZW1wbG8gMiBkb3MgYXRyaWJ1dG9zIGRvIGNhdMOhbG9nbyBnZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJ1BhcsOibWV0cm9zIHBhcmEgb3MgZ3J1cG9zIGRlIHBlcm1pc3PDo28gZGUgZXhlbXBsbyBkb3MgYXRyaWJ1dG9zIGRvIGNhdMOhbG9nbyBnZXJhbC4nOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgTmFtZSEnfSA9ICdVbWEgQ2xhc3NlIGRlIENhdMOhbG9nbyBkZXZlIHRlciB1bSBub21lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiEnfSA9ICdVbWEgQ2xhc3NlIGRlIENhdMOhbG9nbyBkZXZlIHRlciB1bWEgZGVzY3Jpw6fDo28hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MgaXMgcmVxdWlyZWQuJ30gPSAnQSBDbGFzc2UgZGUgQ2F0w6Fsb2dvIMOpIG9icmlnYXTDs3JpYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZC4nfSA9ICdPIG5vbWUgw6kgb2JyaWdhdMOzcmlvLic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnJ1X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICfQpNGD0L3QutGG0LjQvtC90LDQu9GM0L3QvtGB0YLRjCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfQo9C/0YDQsNCy0LvQtdC90LjQtSDQvtCx0YnQuNC8INC60LDRgtCw0LvQvtCz0L7QvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAn0JTQvtCx0LDQstC70LXQvdC40LUg0Y3Qu9C10LzQtdC90YLQsCDQutCw0YLQsNC70L7Qs9CwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAn0JTQvtCx0LDQstC70LXQvdC40LUg0LrQu9Cw0YHRgdCwINC60LDRgtCw0LvQvtCz0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ9Ca0LvQsNGB0YEg0LrQsNGC0LDQu9C+0LPQsCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn0J7QsdGJ0LjQuSDQutCw0YLQsNC70L7Qsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX0NOX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICflip/og73nlKjpgJQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn5oC755uu5b2V566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICflop7liqDnm67lvZXpobnnm64nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICflop7liqDmlrDnm67lvZXliIbnuqcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ+ebruW9leWIhue6pyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBsaXN0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUxpc3QnICkgewogICAgICAgIG15ICRDbGFzcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzIiApIHx8ICcnOwoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBjbGFzcwogICAgICAgIGlmICggISRDbGFzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXZhaWxhYmlsaXR5IGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGl0ZW0gbGlzdAogICAgICAgIG15ICRJdGVtSURMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGxpc3QKICAgICAgICBpZiAoICEkSXRlbUlETGlzdCB8fCAhJXskSXRlbUlETGlzdH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEl0ZW1JRCAoIHNvcnQgeyAkSXRlbUlETGlzdC0+eyRhfSBjbXAgJEl0ZW1JRExpc3QtPnskYn0gfSBrZXlzICV7JEl0ZW1JRExpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgaXRlbSBkYXRhCiAgICAgICAgICAgIG15ICRJdGVtRGF0YSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBpdGVtIGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SXRlbUxpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskSXRlbURhdGF9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7ICRJdGVtRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZEl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIEFjdGlvbk92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5HZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRhbG9nIGl0ZW0gZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0l0ZW1FZGl0JyApIHsKICAgICAgICBteSAlSXRlbURhdGE7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICRJdGVtRGF0YXtJdGVtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiSXRlbUlEIiApOwoKICAgICAgICAjIGFkZCBhIG5ldyBjYXRhbG9nIGl0ZW0KICAgICAgICBpZiAoICRJdGVtRGF0YXtJdGVtSUR9IGVxICdORVcnICkgewoKICAgICAgICAgICAgIyBnZXQgY2xhc3MKICAgICAgICAgICAgJEl0ZW1EYXRhe0NsYXNzfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzIiApOwoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldwogICAgICAgICAgICBpZiAoICEkSXRlbURhdGF7Q2xhc3N9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYW4gZXhpc3RpbmcgY2F0YWxvZyBpdGVtCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YQogICAgICAgICAgICBpZiAoICEkSXRlbURhdGFSZWYgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAlSXRlbURhdGEgPSAleyRJdGVtRGF0YVJlZn07CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgVmFsaWRPcHRpb25TdHJnCiAgICAgICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICAgICAgbXkgJFZhbGlkT3B0aW9uU3RyZyAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkSXRlbURhdGF7VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFZhbGlkT3B0aW9uU3RyZyA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlYWNoIHByZWZlcmVuY2VzIHNldHRpbmcKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAoKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVQcmVmZXJlbmNlcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgfTsKICAgICAgICB9CgogICAgICAgIElURU06CiAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKCiAgICAgICAgICAgICMgc2tpcCBpdGVtcyB0aGF0IGRvbid0IGJlbG9uZyB0byB0aGUgY2xhc3MKICAgICAgICAgICAgaWYgKCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57Q2xhc3N9ICYmICRQcmVmZXJlbmNlc3skSXRlbX0tPntDbGFzc30gbmUgJEl0ZW1EYXRhe0NsYXNzfSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgSVRFTTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaW5kIG91dHB1dCBtb2R1bGUKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skSXRlbX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljJzsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjcmVhdGUgb2JqZWN0IGZvciB0aGlzIHByZWZlcmVuY2VzIGl0ZW0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBhbGwgcGFyYW1ldGVycwogICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIEdlbmVyYWxDYXRhbG9nRGF0YSA9PiB7ICVJdGVtRGF0YSwgJVBhcmFtIH0gKTsKICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgcmVmKCAkUGFyYW1JdGVtLT57RGF0YX0gKSBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICAgICB8fCByZWYoICRQcmVmZXJlbmNlc3skSXRlbX0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1JdGVtLT57J09wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbUl0ZW0tPntCbG9ja30gfHwgJFByZWZlcmVuY2VzeyRJdGVtfS0+e0Jsb2NrfSB8fCAnT3B0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRJdGVtRGF0YXtDbGFzc30gZXEgJ05FVycgKSB7CgogICAgICAgICAgICAjIG91dHB1dCBJdGVtRWRpdENsYXNzQWRkCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdENsYXNzQWRkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NFeGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUVkaXRDbGFzc0V4aXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbVNhdmUnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ2xhc3MgSXRlbUlEIFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICAgICAgJEl0ZW1EYXRheyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbmFtZSBwYXJhbSwgbmFtZSBtdXN0IGJlIG5vdCBlbXB0eSwgYnV0IG51bWJlciB6ZXJvICgwKSBpcyBhbGxvd2VkCiAgICAgICAgJEl0ZW1EYXRhe05hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmFtZScgKTsKCiAgICAgICAgIyBjaGVjayBjbGFzcwogICAgICAgIGlmICggJEl0ZW1EYXRhe0NsYXNzfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgbXkgJFN1Y2Nlc3M7CiAgICAgICAgbXkgJEl0ZW1JRCA9ICRJdGVtRGF0YXtJdGVtSUR9OwogICAgICAgIGlmICggJEl0ZW1EYXRhe0l0ZW1JRH0gZXEgJ05FVycgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkSXRlbUlEID0gJFN1Y2Nlc3M7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtVXBkYXRlKAogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJEdDRGF0YSAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoIEl0ZW1JRCA9PiAkSXRlbUlEICk7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gKCk7CiAgICAgICAgbXkgJE5vdGUgICAgICAgID0gJyc7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSB9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJdGVtICgga2V5cyAlUHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXN7JEl0ZW19LT57TW9kdWxlfQogICAgICAgICAgICAgICAgfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRJdGVtfSwKICAgICAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSggR2VuZXJhbENhdGFsb2dEYXRhID0+ICRHQ0RhdGEgKTsKICAgICAgICAgICAgaWYgKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBteSBAQXJyYXkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbUl0ZW0tPntOYW1lfSApOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFBhcmFtSXRlbS0+e05hbWV9IH0gPSBcQEFycmF5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICEkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFtID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1JRCAgID0+ICRHQ0RhdGEtPntJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoIEluZm8gPT4gJE9iamVjdC0+RXJyb3IoKSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcgY2xhc3MgbGlzdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249SXRlbUxpc3Q7Q2xhc3M9JEl0ZW1EYXRhe0NsYXNzfSIKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0NsYXNzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2F0YWxvZyBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc0xpc3QoKTsKCiAgICAgICAgZm9yIG15ICRDbGFzcyAoIEB7JENsYXNzTGlzdH0gKSB7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBjbGFzcyBsaXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0NsYXNzTGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25BZGRDbGFzcwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZENsYXNzJywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBVc2VySUQKICAgICAgICBQYXJhbU9iamVjdCBDb25maWdJdGVtIEdlbmVyYWxDYXRhbG9nT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBkaWUgIkdvdCBubyAkT2JqZWN0ISIgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApOwogICAgfQoKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUGFyYW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAUGFyYW1zID0gKCk7CiAgICBteSAkR2V0UGFyYW0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSApOwoKICAgIGlmICggIWRlZmluZWQoJEdldFBhcmFtKSApIHsKICAgICAgICAkR2V0UGFyYW0KICAgICAgICAgICAgPSBkZWZpbmVkKCAkUGFyYW17R2VuZXJhbENhdGFsb2dEYXRhfS0+eyAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57UHJlZktleX0gfSApCiAgICAgICAgICAgID8gJFBhcmFte0dlbmVyYWxDYXRhbG9nRGF0YX0tPnsgJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9IH0KICAgICAgICAgICAgOiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57RGF0YVNlbGVjdGVkfTsKICAgIH0KCiAgICBpZiAoICEoIGRlZmluZWQgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSAmJiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57QmxvY2t9ICkgKSB7CiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSA9ICdUZXh0JzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gZXEgJ1Blcm1pc3Npb24nICkgewogICAgICAgICRQYXJhbXtEYXRhfSAgICAgICAgID0geyAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICkgfTsKICAgICAgICAkUGFyYW17UG9zc2libGVOb25lfSA9IDE7CiAgICAgICAgJFBhcmFte0Jsb2NrfSAgICAgICAgPSAnT3B0aW9uJzsKICAgIH0KCiAgICBwdXNoKAogICAgICAgIEBQYXJhbXMsCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQFBhcmFtczsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkUGFyYW17R2V0UGFyYW19IH0gKSB7CiAgICAgICAgbXkgQEFycmF5ID0gQHsgJFBhcmFte0dldFBhcmFtfS0+eyRLZXl9IH07CiAgICAgICAgZm9yIG15ICRWYWx1ZSAoQEFycmF5KSB7CgogICAgICAgICAgICAjIHByZWYgdXBkYXRlIGRiCiAgICAgICAgICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJFZhbHVlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e01lc3NhZ2V9ID0gJ1ByZWZlcmVuY2VzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ISc7CiAgICByZXR1cm4gMTsKfQoKc3ViIEVycm9yIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57RXJyb3J9IHx8ICcnOwp9CgpzdWIgTWVzc2FnZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAkU2VsZi0+e01lc3NhZ2V9IHx8ICcnOwp9CgoxOwo=
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCJ9PC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJBY3Rpb25zIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0nQ29udGVudCc+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgo8IS0tZHRsOmJsb2NrOkFjdGlvbkFkZEl0ZW0tLT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtRWRpdCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSIkUURhdGF7IkNsYXNzIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9Ik5FVyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQbHVzIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRUZXh0eyJBZGQgQ2F0YWxvZyBJdGVtIn08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS1kdGw6YmxvY2s6QWN0aW9uQWRkSXRlbS0tPgo8IS0tZHRsOmJsb2NrOkFjdGlvbkFkZENsYXNzLS0+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbUVkaXQiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9Ik5FVyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSJORVciLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUGx1cyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4kVGV4dHsiQWRkIENhdGFsb2cgQ2xhc3MifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KPCEtLWR0bDpibG9jazpBY3Rpb25BZGRDbGFzcy0tPgo8IS0tZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3LS0+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+JFRleHR7IkdvIHRvIG92ZXJ2aWV3In08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS1kdGw6YmxvY2s6QWN0aW9uT3ZlcnZpZXctLT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzcyAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiTGlzdCJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJDYXRhbG9nIENsYXNzIn08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzTGlzdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBc0Jsb2NrIiAgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249SXRlbUxpc3Q7Q2xhc3M9JExRRGF0YXsiQ2xhc3MifSI+JFFEYXRheyJDbGFzcyJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzIC0tPgoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdJdGVtIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJMaXN0In08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXNjBwYyI+JFFEYXRheyJDbGFzcyJ9PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj4kVGV4dHsiVmFsaWQifTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1JdGVtRWRpdDtJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+JFFEYXRheyJOYW1lIn08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPiRUZXh0eyIkRGF0YXsiVmFsaWQifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdJdGVtTGlzdCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KCjwhLS0gZHRsOmJsb2NrOkl0ZW1FZGl0IC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJJdGVtIn0gJFRleHR7IkVkaXQifTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtU2F2ZSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IiRRRGF0YXsiSXRlbUlEIn0iLz4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CjwhLS0gZHRsOmJsb2NrOkl0ZW1FZGl0Q2xhc3NBZGQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkNsYXNzRHNjIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiRUZXh0eyJDYXRhbG9nIENsYXNzIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNsYXNzIiBpZD0iQ2xhc3NEc2MiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiBtYXhsZW5ndGg9IjEwMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNsYXNzRHNjRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDbGFzc0RzY1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkl0ZW1FZGl0Q2xhc3NBZGQgLS0+CjwhLS0gZHRsOmJsb2NrOkl0ZW1FZGl0Q2xhc3NFeGlzdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJDYXRhbG9nIENsYXNzIn06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2xhc3MifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSIkUURhdGF7IkNsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzRXhpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5hbWUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+JFRleHR7Ik5hbWUifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIGlkPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgbWF4bGVuZ3RoPSIxMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJbnB1dEtleSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iJFFEYXRheyJOYW1lIn0iPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkRGF0YXsiS2V5In0ifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiBpZD0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIkUURhdGF7IlNlbGVjdGVkSUQifSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjEwMCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJbnB1dEtleSAtLT4KPCEtLSBkdGw6YmxvY2s6SW5wdXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifTo8YnIvPjxlbT4oJFRleHR7IiREYXRheyJEZXNjIn0ifSk8L2VtPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgaWQ9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iJFFEYXRheyJTZWxlY3RlZElEIn0iIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJbnB1dCAtLT4KPCEtLSBkdGw6YmxvY2s6VGV4dEFyZWEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifTo8YnIvPjxlbT4oJFRleHR7IiREYXRheyJEZXNjIn0ifSk8L2VtPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSIkUURhdGF7Ik5hbWUifSIgaWQ9IiRRRGF0YXsiTmFtZSJ9IiByb3dzPSIkUURhdGF7IlJvd3MifSIgY29scz0iJFFEYXRheyJDb2xzIn0iPiRRRGF0YXsiU2VsZWN0ZWRJRCJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGV4dEFyZWEgLS0+CjwhLS0gZHRsOmJsb2NrOk9wdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iJFFEYXRheyJOYW1lIn0iPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkRGF0YXsiS2V5In0ifTo8YnIvPjxlbT4oJFRleHR7IiREYXRheyJEZXNjIn0ifSk8L2VtPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJPcHRpb24ifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CjwhLS0gZHRsOmJsb2NrOlVwbG9hZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iJFFEYXRheyJOYW1lIn0iPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkRGF0YXsiS2V5In0ifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiBpZD0iJFFEYXRheyJOYW1lIn0iIHR5cGU9ImZpbGUiIHNpemU9IjMwIiBjbGFzcz0iZml4ZWQiLz48YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIj4kUURhdGF7IkZpbGVuYW1lIn08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlVwbG9hZCAtLT4KPCEtLSBkdGw6YmxvY2s6UGFzc3dvcmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIGlkPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiIgY2xhc3M9Ilc1MHBjIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlBhc3N3b3JkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWxpZElEIj4kVGV4dHsiVmFsaWQifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlZhbGlkT3B0aW9uU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21tZW50Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgaWQ9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjIwMCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiB0eXBlPSJzdWJtaXQiIGlkPSJTdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iPiRUZXh0eyJTdWJtaXQifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Im9yIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0iPiRUZXh0eyJDYW5jZWwifTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkl0ZW1FZGl0IC0tPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2Pgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbDsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cgLSBnZW5lcmFsIGNhdGFsb2cgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBnZW5lcmFsIGNhdGFsb2cgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBsb2FkIGdlbmVyYXRvciBwcmVmZXJlbmNlcyBtb2R1bGUKICAgIG15ICRHZW5lcmF0b3JNb2R1bGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzTW9kdWxlJykKICAgICAgICB8fCAnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCJzsKICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJhdG9yTW9kdWxlKSApIHsKICAgICAgICAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fSA9ICRHZW5lcmF0b3JNb2R1bGUtPm5ldyglUGFyYW0pOwogICAgfQoKICAgICMgY3JlYXRlIENhY2hlSW50ZXJuYWwgb2JqZWN0CiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWwtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgVFRMICA9PiA2MCAqIDYwICogMywKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDbGFzc0xpc3QoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSBvZiBhbGwgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzZXMKCiAgICBteSAkQXJyYXlSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzTGlzdCgpOwoKPWN1dAoKc3ViIENsYXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVChnZW5lcmFsX2NhdGFsb2dfY2xhc3MpICcKICAgICAgICAgICAgLiAnRlJPTSBnZW5lcmFsX2NhdGFsb2cgT1JERVIgQlkgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ2xhc3NMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDbGFzc0xpc3QsICRSb3dbMF07CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICBteSAkQ2FjaGVLZXkgPSAnQ2xhc3NMaXN0JzsKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBDbGFzc0xpc3QsCiAgICApOwoKICAgIHJldHVybiBcQENsYXNzTGlzdDsKfQoKPWl0ZW0gQ2xhc3NSZW5hbWUoKQoKcmVuYW1lIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCgogICAgbXkgJFRydWUgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICdJVFNNOjpDb25maWdJdGVtOjpTdGF0ZScsCiAgICAgICAgQ2xhc3NOZXcgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKPWN1dAoKc3ViIENsYXNzUmVuYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzT2xkIENsYXNzTmV3KSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc09sZCBDbGFzc05ldykpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17Q2xhc3NOZXd9IGVxICRQYXJhbXtDbGFzc09sZH07CgogICAgIyBjaGVjayBpZiBuZXcgY2xhc3MgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2xhc3NOZXd9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQWxyZWFkeUV4aXN0cyA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBbHJlYWR5RXhpc3RzID0gMTsKICAgIH0KCiAgICBpZiAoJEFscmVhZHlFeGlzdHMpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHJlbmFtZSBjbGFzcyAkUGFyYW17Q2xhc3NPbGR9ISBOZXcgY2xhc3NuYW1lIGFscmVhZHkgZXhpc3RzLiIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgIyByZW5hbWUgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGdlbmVyYWxfY2F0YWxvZyBTRVQgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzTmV3fSwgXCRQYXJhbXtDbGFzc09sZH0gXSwKICAgICk7Cn0KCj1pdGVtIEl0ZW1MaXN0KCkKCnJldHVybnMgYSBsaXN0IGFzIGEgaGFzaCByZWZlcmVuY2Ugb2Ygb25lIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwoKICAgIG15ICRIYXNoUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBWYWxpZCAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICAgICBQcmVmZXJlbmNlcyAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IHt9CiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gMiwgICAgICAgICAgICAgICAgICAgICAjIG9yIHdoYXRldmVyIHByZWZlcmVuY2VzIGNhbiBiZSB1c2VkCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3MhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkUGFyYW17VmFsaWR9ID0gMTsKICAgIH0KCiAgICBteSAkUHJlZmVyZW5jZXNDYWNoZUtleSA9ICcnOwogICAgbXkgJFByZWZlcmVuY2VzVGFibGUgICAgPSAnJzsKICAgIG15ICRQcmVmZXJlbmNlc1doZXJlICAgID0gJyc7CiAgICBteSBAUHJlZmVyZW5jZXNCaW5kOwoKICAgICMgaGFuZGxlIGdpdmVuIHByZWZlcmVuY2VzCiAgICBpZiAoIGV4aXN0cyAkUGFyYW17UHJlZmVyZW5jZXN9ICYmIHJlZiAkUGFyYW17UHJlZmVyZW5jZXN9IGVxICdIQVNIJyApIHsKCiAgICAgICAgJFByZWZlcmVuY2VzVGFibGUgPSAnLCBnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMnOwogICAgICAgIG15IEBXaGVyZXM7CgogICAgICAgICMgYWRkIGFsbCBwcmVmZXJlbmNlcyBnaXZlbiB0byB3aGVyZS1jbGF1c2UKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFBhcmFte1ByZWZlcmVuY2VzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCByZWYoICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSApIG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gPSBbICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBXaGVyZXMsICcocHJlZl9rZXkgPSA/IEFORCBwcmVmX3ZhbHVlIElOICgnCiAgICAgICAgICAgICAgICAuIGpvaW4oICcsICcsIG1hcCB7Jz8nfSBAeyAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gfSApCiAgICAgICAgICAgICAgICAuICcpKSc7CgogICAgICAgICAgICBwdXNoIEBQcmVmZXJlbmNlc0JpbmQsIFwkS2V5LCBtYXAgeyBcJF8gfSBAeyAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gfTsKCiAgICAgICAgICAgICMgYWRkIGZ1bmN0aW9uYWxpdHkgbGlzdCB0byBjYWNoZSBrZXkKICAgICAgICAgICAgJFByZWZlcmVuY2VzQ2FjaGVLZXkgLj0gJyMjIyMnIGlmICRQcmVmZXJlbmNlc0NhY2hlS2V5OwogICAgICAgICAgICAkUHJlZmVyZW5jZXNDYWNoZUtleSAuPSBqb2luIHF7IyMjI30sICRLZXksIG1hcCB7JF99IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9OwogICAgICAgIH0KCiAgICAgICAgJFByZWZlcmVuY2VzV2hlcmUKICAgICAgICAgICAgPSAnQU5EIGdlbmVyYWxfY2F0YWxvZy5pZCA9IGdlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcy5nZW5lcmFsX2NhdGFsb2dfaWQnOwogICAgICAgICRQcmVmZXJlbmNlc1doZXJlIC49ICcgQU5EICcgLiBqb2luICcgQU5EICcsIEBXaGVyZXM7CiAgICB9CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJFByZWZlcmVuY2VzVGFibGUgIgogICAgICAgIC4gIldIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gJFByZWZlcmVuY2VzV2hlcmUgIjsKICAgIG15IEBCSU5EID0gKCBcJFBhcmFte0NsYXNzfSwgQFByZWZlcmVuY2VzQmluZCApOwoKICAgICMgYWRkIHZhbGlkIHN0cmluZyB0byBzcWwgc3RyaW5nCiAgICBpZiAoICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIHZhbGlkX2lkID0gMSAnOwogICAgfQoKICAgICMgY3JlYXRlIGNhY2hlIGtleQogICAgbXkgJENhY2hlS2V5CiAgICAgICAgPSAnSXRlbUxpc3Q6OicgLiAkUGFyYW17Q2xhc3N9IC4gJyMjIyMnIC4gJFBhcmFte1ZhbGlkfSAuICcjIyMjJyAuICRQcmVmZXJlbmNlc0NhY2hlS2V5OwoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICBteSAkQ2FjaGUgPSAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5HZXQoIEtleSA9PiAkQ2FjaGVLZXkgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgICMgY2hlY2sgaXRlbQogICAgaWYgKCAhJURhdGEgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDbGFzcyAkUGFyYW17Q2xhc3N9IG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJURhdGEsCiAgICApOwoKICAgIHJldHVybiBcJURhdGE7Cn0KCj1pdGVtIEl0ZW1HZXQoKQoKZ2V0IGl0ZW0gYXR0cmlidXRlcwoKICAgIG15ICRJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICBJdGVtSUQgPT4gMywKICAgICk7CgogICAgb3IKCiAgICBteSAkSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgID0+ICdVbmRlcnBpbm5pbmcgQ29udHJhY3QnLAogICAgKTsKCnJldHVybnMKCiAgICBteSAkSXRlbSA9IHsKICAgICAgICAnSXRlbUlEJyAgICAgPT4gJzIzJywKICAgICAgICAnQ2xhc3MnICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgICdOYW1lJyAgICAgICA9PiAnVW5kZXJwaW5uaW5nIENvbnRyYWN0JwogICAgICAgICdDb21tZW50JyAgICA9PiAnU29tZSBDb21tZW50JywKICAgICAgICAnVmFsaWRJRCcgICAgPT4gJzEnLAogICAgICAgICdDcmVhdGVUaW1lJyA9PiAnMjAxMi0wMS0xMiAwOTozNjoyNCcsCiAgICAgICAgJ0NyZWF0ZUJ5JyAgID0+ICcxJywKICAgICAgICAnQ2hhbmdlVGltZScgPT4gJzIwMTItMDEtMTIgMDk6MzY6MjQnLAogICAgICAgICdDaGFuZ2VCeScgICA9PiAnMScsCiAgICB9OwoKPWN1dAoKc3ViIEl0ZW1HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW1JRH0gJiYgKCAhJFBhcmFte0NsYXNzfSB8fCAkUGFyYW17TmFtZX0gZXEgJycgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbUlEIE9SIENsYXNzIGFuZCBOYW1lIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCwgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzLCBuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsICcKICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5IEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFICc7CiAgICBteSBAQklORDsKCiAgICAjIGFkZCBvcHRpb25zIHRvIHNxbCBzdHJpbmcKICAgIGlmICggJFBhcmFte0NsYXNzfSAmJiAkUGFyYW17TmFtZX0gbmUgJycgKSB7CgogICAgICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0l0ZW1HZXQ6OkNsYXNzOjonIC4gJFBhcmFte0NsYXNzfSAuICc6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgICMgYWRkIGNsYXNzIGFuZCBuYW1lIHRvIHNxbCBzdHJpbmcKICAgICAgICAkU1FMIC49ICdnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPyc7CiAgICAgICAgcHVzaCBAQklORCwgKCBcJFBhcmFte0NsYXNzfSwgXCRQYXJhbXtOYW1lfSApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0l0ZW1HZXQ6Okl0ZW1JRDo6JyAuICRQYXJhbXtJdGVtSUR9OwogICAgICAgIG15ICRDYWNoZSA9ICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkdldCggS2V5ID0+ICRDYWNoZUtleSApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICAgICAjIGFkZCBpdGVtIGlkIHRvIHNxbCBzdHJpbmcKICAgICAgICAkU1FMIC49ICdpZCA9ID8nOwogICAgICAgIHB1c2ggQEJJTkQsIFwkUGFyYW17SXRlbUlEfTsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJJTkQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlSXRlbURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRJdGVtRGF0YXtJdGVtSUR9ICAgICA9ICRSb3dbMF07CiAgICAgICAgJEl0ZW1EYXRhe0NsYXNzfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkSXRlbURhdGF7TmFtZX0gICAgICAgPSAkUm93WzJdOwogICAgICAgICRJdGVtRGF0YXtWYWxpZElEfSAgICA9ICRSb3dbM107CiAgICAgICAgJEl0ZW1EYXRhe0NvbW1lbnR9ICAgID0gJFJvd1s0XSB8fCAnJzsKICAgICAgICAkSXRlbURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzVdOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVCeX0gICA9ICRSb3dbNl07CiAgICAgICAgJEl0ZW1EYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s3XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlQnl9ICAgPSAkUm93WzhdOwogICAgfQoKICAgICMgY2hlY2sgaXRlbQogICAgaWYgKCAhJEl0ZW1EYXRhe0l0ZW1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJdGVtIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoIEl0ZW1JRCA9PiAkSXRlbURhdGF7SXRlbUlEfSApOwoKICAgICMgbWVyZ2UgaGFzaAogICAgaWYgKCVQcmVmZXJlbmNlcykgewogICAgICAgICVJdGVtRGF0YSA9ICggJUl0ZW1EYXRhLCAlUHJlZmVyZW5jZXMgKTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnSXRlbUdldDo6Q2xhc3M6OicgLiAkSXRlbURhdGF7Q2xhc3N9IC4gJzo6JyAuICRJdGVtRGF0YXtOYW1lfSwKICAgICAgICBWYWx1ZSA9PiBcJUl0ZW1EYXRhLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnSXRlbUdldDo6SXRlbUlEOjonIC4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgVmFsdWUgPT4gXCVJdGVtRGF0YSwKICAgICk7CgogICAgcmV0dXJuIFwlSXRlbURhdGE7Cn0KCj1pdGVtIEl0ZW1BZGQoKQoKYWRkIGEgbmV3IGdlbmVyYWwgY2F0YWxvZyBpdGVtCgogICAgbXkgJEl0ZW1JRCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdJdGVtIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgICAgID0+ICdDb21tZW50JywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcyBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuYW1lIG11c3QgYmUgbm90IGVtcHR5LCBidXQgbnVtYmVyIHplcm8gKDApIGlzIGFsbG93ZWQKICAgIGlmICggJFBhcmFte05hbWV9IGVxICcnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBOYW1lISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9ICcnOwogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzKSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmluZCBleGl0aW5nIGl0ZW0gd2l0aCBzYW1lIG5hbWUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nICcKICAgICAgICAgICAgLiAnV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzfSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROb0FkZCA9IDE7CiAgICB9CgogICAgIyBhYm9ydCBpbnNlcnQgb2YgbmV3IGl0ZW0sIGlmIGl0ZW0gbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCROb0FkZCkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyBpdGVtISBHZW5lcmFsIGNhdGFsb2cgaXRlbSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+Q2xlYW5VcCgpOwoKICAgICMgaW5zZXJ0IG5ldyBpdGVtCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGdlbmVyYWxfY2F0YWxvZyAnCiAgICAgICAgICAgIC4gJyhnZW5lcmFsX2NhdGFsb2dfY2xhc3MsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgJwogICAgICAgICAgICAuICcoPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbW1lbnR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IGl0ZW0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nICcKICAgICAgICAgICAgLiAnV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzfSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJEl0ZW1JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEl0ZW1JRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRJdGVtSUQ7Cn0KCj1pdGVtIEl0ZW1VcGRhdGUoKQoKdXBkYXRlIGFuIGV4aXN0aW5nIGdlbmVyYWwgY2F0YWxvZyBpdGVtCgogICAgbXkgJFRydWUgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1VcGRhdGUoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnSXRlbSBOYW1lJywKICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbmFtZSBtdXN0IGJlIG5vdCBlbXB0eSwgYnV0IG51bWJlciB6ZXJvICgwKSBpcyBhbGxvd2VkCiAgICBpZiAoICRQYXJhbXtOYW1lfSBlcSAnJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgTmFtZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb21tZW50KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9IHx8PSAnJzsKICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcykpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBvZiBpdGVtCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ2xhc3M7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDbGFzcyA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCAhJENsYXNzICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIG5vdCBmb3VuZCBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJENsYXNzLCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVXBkYXRlID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17SXRlbUlEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkVXBkYXRlID0gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFVwZGF0ZSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IHVwZGF0ZSBpdGVtISBHZW5lcmFsIGNhdGFsb2cgaXRlbSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+Q2xlYW5VcCgpOwoKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgZ2VuZXJhbF9jYXRhbG9nIFNFVCAnCiAgICAgICAgICAgIC4gJ25hbWUgPSA/LCB2YWxpZF9pZCA9ID8sIGNvbW1lbnRzID0gPywgJwogICAgICAgICAgICAuICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCAgXCRQYXJhbXtJdGVtSUR9LAogICAgICAgIF0sCiAgICApOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KCkKCnNldCBHZW5lcmFsQ2F0YWxvZyBwcmVmZXJlbmNlcwoKICAgICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgICAgIEtleSAgICA9PiAnVXNlckNvbW1lbnQnLAogICAgICAgIFZhbHVlICA9PiAnc29tZSBjb21tZW50JywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KEBfKTsKfQoKPWl0ZW0gR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgpCgpnZXQgR2VuZXJhbENhdGFsb2cgcHJlZmVyZW5jZXMKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkUXVldWVPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldChAXyk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cvUHJlZmVyZW5jZXNEQi5wbSAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EpOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQiAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKCj1oZWFkMSBTWU5PUFNJUwoKc29tZSBwcmVmZXJlbmNlcyBmdW5jdGlvbnMgZm9yIGdlbmVyYWwgY2F0YWxvZwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgcHJlZmVyZW5jZXMgdGFibGUgZGF0YQogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSAgICAgID0gJ2dlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyc7CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9ICAgPSAncHJlZl9rZXknOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9ID0gJ3ByZWZfdmFsdWUnOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlR2NJRH0gID0gJ2dlbmVyYWxfY2F0YWxvZ19pZCc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KCkKClNldCBwcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gMTIzNCwKICAgICAgICBLZXkgICAgPT4gJ0Z1bmN0aW9uYWxpdHknLAogICAgICAgIFZhbHVlICA9PiAnb3BlcmF0aW9uYWwnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQgS2V5IFZhbHVlKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgb2xkIGRhdGEKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSBXSEVSRSAiCiAgICAgICAgICAgIC4gIiRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyBBTkQgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSA9ID8iLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGluc2VydCBuZXcgZGF0YQogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gKCRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9LCAiCiAgICAgICAgICAgIC4gIiAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0pICIKICAgICAgICAgICAgLiAiIFZBTFVFUyAoPywgPywgPykiLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICAgICAgXCRQYXJhbXtWYWx1ZX0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoKQoKR2V0IGFsbCBQcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBxdWV1ZSBwcmVmZXJlbmNlcyBhcmUgYXZhaWxhYmxlCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0gIgogICAgICAgICAgICAuICIgRlJPTSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9IFdIRVJFICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICVEYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnQgLSBnZW5lcmFsIGNhdGFsb2cgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDIgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0dlbmVyYWxDYXRhbG9nJyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUdlbmVyYWxDYXRhbG9nLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtR2VuZXJhbENhdGFsb2ctJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBjbGFzc2VzCm15IEBDbGFzc1JhbmQ7Cgpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDMgKSB7CgogICAgcHVzaCBAQ2xhc3NSYW5kLCBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgc3RvcmUgb3JpZ2luYWwgZ2VuZXJhbCBjYXRhbG9nIHBlcm1pc3Npb24gcHJlZmVyZW5jZXMgc2V0dGluZwpteSAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnOwppZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpLT57UGVybWlzc2lvbnN9Owp9CgojIGVuYWJsZSBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nIHdpdGggYSBkdW1teSB0cnVlIHZhbHVlCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW0xJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgPT4gJ1Rlc3RJdGVtMicsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgc2V0CiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXNTZXQgPT4gewogICAgICAgICAgICBIZWxsbyA9PiAnV29ybGQnLAogICAgICAgICAgICBDb2xvciA9PiAnUmVkJywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ1JlZCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHByZWZlcmVuY2VzIG9mIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBzZXQKICAgIHsKICAgICAgICBQcmVmZXJlbmNlc1NldCA9PiB7CiAgICAgICAgICAgIEhlbGxvID0+ICdOZXdXb3JsZCcsCiAgICAgICAgICAgIENvbG9yID0+ICdCbHVlJywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ05ld1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ0JsdWUnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdUZXN0SXRlbTVVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gIiBcdCBcbiBcciBVbml0IFRlc3QgOjogVGVzdCBDbGFzcyBcdCBcbiBcciAiIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyIFRlc3QgSXRlbSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3QgSXRlbScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciBUZXN0IEl0ZW0gVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50IFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzwqknIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIM+SIM+hIFRlc3QgSXRlbSDGqSDPniAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDPoCDQryBUZXN0IENvbW1lbnQg0awg0aAgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3PCqScgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnz5Igz6EgVGVzdCBJdGVtIMapIM+eJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ8+gINCvIFRlc3QgQ29tbWVudCDRrCDRoCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdCBJdGVtIMapIMmkIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ID0+ICcgVGVzdCBDb21tZW50INGZINGSIFVQREFURTEgJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gxqkgyaQgVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50INGZINGSIFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChhIHNlY29uZCBpdGVtIHdpdGggRnVuY3Rpb25hbGl0eSAndGVzdDEnKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoc2V0IGZ1bmN0aW9uYWxpdHkgdG8gJycpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02VVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgSXRlbSBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgVVBEQVRFMSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW1QcmVmZXJlbmNlcycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtUHJlZmVyZW5jZXMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgc2V0CiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXNTZXQgPT4gewogICAgICAgICAgICBUZXN0ICA9PiAnaGVsbG8gd29ybGQnLAogICAgICAgICAgICBHcm91cCA9PiAzMywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgVGVzdCAgPT4gJ2hlbGxvIHdvcmxkJywKICAgICAgICAgICAgR3JvdXAgPT4gMzMsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgVGVzdCA9PiAnaGVsbG8nLAogICAgICAgICAgICBTaXplID0+IDM4LAogICAgICAgIH0sCiAgICAgICAgUHJlZmVyZW5jZXNHZXQgPT4gewogICAgICAgICAgICBUZXN0ID0+ICdoZWxsbycsCiAgICAgICAgICAgIFNpemUgPT4gMzgsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaGFzIGFuIGVtcHR5IG5hbWUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICcnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGFkZGVkLCB0aGUgbnVtYmVyIHplcm8gKDApIGlzIGFsbG93ZWQgYXMgbmFtZQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnMCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJzAnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5ICh1cGRhdGluZyBuYW1lIHRvIG51bWJlciB6ZXJvICgwKSApCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnMCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJzAnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBub3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseQogICAgIyAoZW1wdHkgc3RyaW5nIGFzIG5hbWUgaXMgbm90IGFsbG93ZWQgKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSAkTGFzdEFkZGVkSXRlbUlEOwpteSAlQWRkZWRJdGVtQ291bnRlcjsKCmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IGl0ZW0KICAgICAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICV7ICRJdGVtLT57QWRkfSB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaXRlbSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkSXRlbUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUFkZCgpIC0gSXRlbUtleTogJEl0ZW1JRCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJEl0ZW1JRCkgewoKICAgICAgICAgICAgICAgICMgc2V0IGxhc3QgaXRlbSBpZCB2YXJpYWJsZQogICAgICAgICAgICAgICAgJExhc3RBZGRlZEl0ZW1JRCA9ICRJdGVtSUQ7CgogICAgICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIGFkZGVkIGl0ZW0gY291bnRlcgogICAgICAgICAgICAgICAgJEFkZGVkSXRlbUNvdW50ZXJ7ICRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfSB9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRJdGVtSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtQWRkKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaXRlbSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgY3JlYXRpb24gb2YgaXRlbSB1c2luZyBJdGVtSWQgYW5kIFVzZXJJRAogICAgICAgIG15ICRJdGVtR2V0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntBZGR9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQtPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSBVc2luZyBJdGVtSUQgYW5kIFVzZXJJRCAtICRJdGVtQXR0cmlidXRlICIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBjcmVhdGlvbiBvZiBpdGVtIHVzaW5nIENsYXNzIGFuZCBOYW1lCiAgICAgICAgJEl0ZW1HZXQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9LAogICAgICAgICAgICBOYW1lICA9PiAkSXRlbS0+e0FkZEdldH0tPntOYW1lfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQtPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSBVc2luZyBDbGFzcyBhbmQgTmFtZSAtICRJdGVtQXR0cmlidXRlICIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIGxhc3QgaXRlbSBpZCB2YXJhaWJsZQogICAgICAgIGlmICggISRMYXN0QWRkZWRJdGVtSUQgKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBOTyBMQVNUIElURU0gSUQgR0lWRU4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIGl0ZW0KICAgICAgICBteSAkVXBkYXRlU3VjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1VcGRhdGUoCiAgICAgICAgICAgICV7ICRJdGVtLT57VXBkYXRlfSB9LAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGl0ZW0gd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtVXBkYXRlKCkgLSBJdGVtS2V5OiAkTGFzdEFkZGVkSXRlbUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtVXBkYXRlKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaXRlbSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZQogICAgICAgIG15ICRJdGVtR2V0MiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57VXBkYXRlfS0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGRhdGEgYWZ0ZXIgdXBkYXRlCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQyLT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gJEl0ZW1BdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9ICkgewoKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJEl0ZW0tPntQcmVmZXJlbmNlc1NldH0gfSApIHsKCiAgICAgICAgICAgICMgc2V0IHByZWZlcmVuY2VzCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkSXRlbS0+e1ByZWZlcmVuY2VzU2V0fS0+eyRLZXl9LAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRMYXN0QWRkZWRJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogUHJlZmVyZW5jZXNTZXQoKSAtICRLZXkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHByZWZlcmVuY2VzCiAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNHZXR9ICkgewogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0gfSApIHsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1ByZWZlcmVuY2VzR2V0fS0+eyRLZXl9IGVxICRQcmVmZXJlbmNlc3skS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogUHJlZmVyZW5jZXNHZXQoKSAtICRLZXkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogUHJlZmVyZW5jZXNHZXQoKSAtICRLZXkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucyBmb3IgbGF0ZXIgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIGFycmF5cwpteSAlRXhpc3RpbmdDbGFzc2VzVG1wOwpJVEVNOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CiAgICBuZXh0IElURU0gaWYgISRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfTsKICAgICRFeGlzdGluZ0NsYXNzZXNUbXB7ICRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfSB9ID0gMTsKfQpteSBARXhpc3RpbmdDbGFzc2VzID0gc29ydCBrZXlzICVFeGlzdGluZ0NsYXNzZXNUbXA7CgpteSAlRXhpc3RpbmdGdW5jdGlvbmFsaXRpZXNUbXA7CklURU06CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKICAgICRJdGVtLT57VXBkYXRlR2V0fS0+e0Z1bmN0aW9uYWxpdHl9IHx8PSAnJzsKICAgICRFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcHsgJEl0ZW0tPntVcGRhdGVHZXR9LT57RnVuY3Rpb25hbGl0eX0gfSA9IDE7Cn0KbXkgQEV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzID0gc29ydCBrZXlzICVFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcDsKCm15IEBOb25FeGlzdGluZ0NsYXNzZXMgPSAoICdVbml0VGVzdDo6Tm9FeGlzdGluZ0NsYXNzMScsICdVbml0VGVzdDo6Tm9FeGlzdGluZ0NsYXNzMicgKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc0xpc3QgdGVzdCAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRDbGFzc0xpc3QxID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRDbGFzc0NvdW50ID0gMDsKICAgIGlmICggJENsYXNzTGlzdDEgJiYgcmVmICRDbGFzc0xpc3QxIGVxICdBUlJBWScgKSB7CiAgICAgICAgJENsYXNzQ291bnQgPSBncmVwIHsgJF8gZXEgJENsYXNzIH0gQHskQ2xhc3NMaXN0MX07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRDbGFzc0NvdW50LAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NMaXN0KCkgLSAkQ2xhc3MgbGlzdGVkIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBOb25FeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkSXRlbUxpc3QsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtICRDbGFzcyBub3QgZXhpc3RzIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCAyCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRMaXN0Q291bnQgPSAnTlVMTCc7CiAgICBpZiAoIGRlZmluZWQgJEl0ZW1MaXN0ICYmIHJlZiAkSXRlbUxpc3QgZXEgJ0hBU0gnICkgewogICAgICAgICRMaXN0Q291bnQgPSBrZXlzICV7JEl0ZW1MaXN0fTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExpc3RDb3VudCwKICAgICAgICAkQWRkZWRJdGVtQ291bnRlcnskQ2xhc3N9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSAkQ2xhc3MgY29ycmVjdCBudW1iZXIgb2YgaXRlbXMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBJdGVtTGlzdCB0ZXN0IDMgLSBJdGVtIExpc3Qgd2l0aCBwcmVmZXJlbmNlcyAoc2luZ2xlIGhhc2ggZW50cnkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKCiAgICBteSAkQ2xhc3MgICAgPSAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdOwogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ1dvcmxkJywKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkTGlzdENvdW50ID0gJ05VTEwnOwogICAgaWYgKCBkZWZpbmVkICRJdGVtTGlzdCAmJiByZWYgJEl0ZW1MaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAkTGlzdENvdW50ID0ga2V5cyAleyRJdGVtTGlzdH07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRMaXN0Q291bnQsCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIHByZWZlcmVuY2VzIChzaW5nbGUgaGFzaCBlbnRyeSkgLSAkQ2xhc3MgY29ycmVjdCBudW1iZXIgb2YgaXRlbXMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBJdGVtTGlzdCB0ZXN0IDQgLSBJdGVtIExpc3Qgd2l0aCBwcmVmZXJlbmNlcyAoYXJyYXkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKCiAgICBteSAkQ2xhc3MgICAgPSAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdOwogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgQ29sb3IgPT4gWyAnUmVkJywgJ0JsdWUnIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJExpc3RDb3VudCA9ICdOVUxMJzsKICAgIGlmICggZGVmaW5lZCAkSXRlbUxpc3QgJiYgcmVmICRJdGVtTGlzdCBlcSAnSEFTSCcgKSB7CiAgICAgICAgJExpc3RDb3VudCA9IGtleXMgJXskSXRlbUxpc3R9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkTGlzdENvdW50LAogICAgICAgIDIsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSBwcmVmZXJlbmNlcyAoYXJyYXkpIC0gJENsYXNzIGNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgUHJlZmVyZW5jZXMgdGVzdCAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRJdGVtSUQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgID0+ICRDbGFzcywKICAgICAgICBOYW1lICAgID0+ICdJdGVtIFByZWZlcmVuY2VzJywKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICBLZXkgICAgPT4gJ1VuaXRUZXN0UHJlZicsCiAgICAgICAgVmFsdWUgID0+ICcxJywKICAgICk7CgogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIFVuaXRUZXN0UHJlZiA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkSXRlbUxpc3QtPnskSXRlbUlEfSwKICAgICAgICAnSXRlbSBQcmVmZXJlbmNlcycsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtIENsYXNzICRDbGFzcyBQcmVmZXJlbmNlcyBtYXRjaCIsCiAgICApOwoKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgIEtleSAgICA9PiAnVW5pdFRlc3RQcmVmJywKICAgICAgICBWYWx1ZSAgPT4gJzInLAogICAgKTsKCiAgICAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgVW5pdFRlc3RQcmVmID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRJdGVtTGlzdCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gQ2xhc3MgJENsYXNzIFByZWZlcmVuY2VzIG5vdCBtYXRjaCBhZnRlciBQcmVmZXJlbmNlc1NldCBDaGFuZ2UiCiAgICApOwoKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgPT4gJEl0ZW1JRCwKICAgICAgICBOYW1lICAgID0+ICdJdGVtIFByZWZlcmVuY2VzJywKICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBQcmVmZXJlbmNlcyB0ZXN0IDIKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKPXBvZAoKbXkgJUZ1bmN0aW9uYWxpdHlMaXN0MTsKbWFwIHsgJEZ1bmN0aW9uYWxpdHlMaXN0MXskX30gPSAxIH0gQEV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzOwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRGdW5jdGlvbmFsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5GdW5jdGlvbmFsaXR5TGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRGdW5jdGlvbmFsaXR5TGlzdCAmJiByZWYgJEZ1bmN0aW9uYWxpdHlMaXN0IGVxICdBUlJBWScsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRnVuY3Rpb25hbGl0eUxpc3QoKSAtIHJldHVybiBhIGFycmF5IHJlZmVyZW5jZSIsCiAgICApOwoKICAgIGZvciBteSAkRnVuY3Rpb25hbGl0eSAoIEB7JEZ1bmN0aW9uYWxpdHlMaXN0fSApIHsKICAgICAgICBkZWxldGUgJEZ1bmN0aW9uYWxpdHlMaXN0MXskRnVuY3Rpb25hbGl0eX07CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgokU2VsZi0+VHJ1ZSgKICAgICFrZXlzICVGdW5jdGlvbmFsaXR5TGlzdDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGdW5jdGlvbmFsaXR5TGlzdCgpIiwKKTsKCiRUZXN0Q291bnQrKzsKCj1jdXQKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDEgKGNoZWNrIG5vcm1hbCByZW5hbWUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCkNMQVNTOgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJE9sZEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MsCiAgICAgICAgQ2xhc3NOZXcgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBSZW5hbWUgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgbXkgJE5ld0l0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgISRPbGRJdGVtTGlzdAogICAgICAgIHx8ICEkTmV3SXRlbUxpc3QKICAgICAgICB8fCByZWYgJE9sZEl0ZW1MaXN0IG5lICdIQVNIJwogICAgICAgIHx8IHJlZiAkTmV3SXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIEl0ZW1MaXN0IGZhaWxlZCIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENMQVNTOwogICAgfQoKICAgIE9MREtFWToKICAgIGZvciBteSAkT2xkS2V5ICgga2V5cyAleyRPbGRJdGVtTGlzdH0gKSB7CgogICAgICAgIGlmICggIWV4aXN0cyAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fSApIHsKICAgICAgICAgICAgJE5ld0l0ZW1MaXN0LT57RmFpbGVkRHVtbXl9ID0gMTsKICAgICAgICAgICAgbmV4dCBPTERLRVk7CiAgICAgICAgfQoKICAgICAgICBuZXh0IE9MREtFWSBpZiAkT2xkSXRlbUxpc3QtPnskT2xkS2V5fSBuZSAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fTsKCiAgICAgICAgZGVsZXRlICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwogICAgfQoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICFrZXlzICV7JE5ld0l0ZW1MaXN0fSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NSZW5hbWUgdGVzdCAyIChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKQ0xBU1M6CmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkT2xkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICAgICBDbGFzc05ldyA9PiAnICcgLiAkQ2xhc3MgLiAiUkUgTkEgTUUgMiBcbiBcciBcdCAiLAogICAgKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBSZW5hbWUgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgbXkgJE5ld0l0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcyAuICdSRU5BTUUyJywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgISRPbGRJdGVtTGlzdAogICAgICAgIHx8ICEkTmV3SXRlbUxpc3QKICAgICAgICB8fCByZWYgJE9sZEl0ZW1MaXN0IG5lICdIQVNIJwogICAgICAgIHx8IHJlZiAkTmV3SXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIEl0ZW1MaXN0IGZhaWxlZCIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENMQVNTOwogICAgfQoKICAgIE9MREtFWToKICAgIGZvciBteSAkT2xkS2V5ICgga2V5cyAleyRPbGRJdGVtTGlzdH0gKSB7CgogICAgICAgIGlmICggIWV4aXN0cyAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fSApIHsKICAgICAgICAgICAgJE5ld0l0ZW1MaXN0LT57RmFpbGVkRHVtbXl9ID0gMTsKICAgICAgICAgICAgbmV4dCBPTERLRVk7CiAgICAgICAgfQoKICAgICAgICBuZXh0IE9MREtFWSBpZiAkT2xkSXRlbUxpc3QtPnskT2xkS2V5fSBuZSAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fTsKCiAgICAgICAgZGVsZXRlICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwogICAgfQoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICFrZXlzICV7JE5ld0l0ZW1MaXN0fSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NSZW5hbWUgdGVzdCAyIChpZGVudGljYWwgbmFtZSB0ZXN0KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIENsYXNzTmV3ID0+ICRDbGFzcyAuICdSRU5BTUUyJywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIG9sZG5hbWUgYW5kIG5ld25hbWUgaWRlbnRpY2FsIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NSZW5hbWUgdGVzdCAzIChuZXcgY2xhc3MgbmFtZSBhbHJlYWR5IGV4aXN0cykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICBDbGFzcyAgICAgICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMl0sCiAgICBOYW1lICAgICAgICAgID0+ICdEdW1teScsCiAgICBGdW5jdGlvbmFsaXR5ID0+ICcnLAogICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgICA9PiAxLAopOwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcyAuICdSRU5BTUUyJywKICAgICAgICBDbGFzc05ldyA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzJdLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2xlYW51cAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIHJlc3RvcmUgb3JpZ2luYWwgZ2VuZXJhbCBjYXRhbG9nIHBlcm1pc3Npb24gcHJlZmVyZW5jZXMgc2V0dGluZwokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjUGVybWlzc2lvbnMnLAogICAgVmFsdWUgPT4gJEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNQZXJtaXNzaW9uc09yZywKKTsKCjE7Cg==
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZzsgICAgIyMgbm8gY3JpdGljCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBKTsKCj1oZWFkMSBOQU1FCgpHZW5lcmFsQ2F0YWxvZy5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CiAgICB1c2UgdmFyOjpwYWNrYWdlc2V0dXA6OkdlbmVyYWxDYXRhbG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFhNTE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29kZU9iamVjdCA9IHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgWE1MT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1pZ3JhdGUgJ2Z1bmN0aW9uYWxpdHknIHRvIGV4dGVybmFsIHRhYmxlCiAgICAjIHRoaXMgaXMgb25seSBuZWNjZXNhcnkgaW4gQ29kZVVwZ3JhZGUsIGZvciBuZXcgaW5zdGFsbGF0aW9ucyB0aGlzIGlzIGRvbmUKICAgICMgaW4gdGhlIHBhY2thZ2UgSVRTTUNvcmUgZHVyaW5nIENvZGVJbnN0YWxsCiAgICAkU2VsZi0+X01pZ3JhdGVGdW5jdGlvbmFsaXR5KCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfTWlncmF0ZUZ1bmN0aW9uYWxpdHkoKQoKPWN1dAoKc3ViIF9NaWdyYXRlRnVuY3Rpb25hbGl0eSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgU0VMRUNUIGFsbCBmdW5jdGlvbmFsaXR5IHZhbHVlcwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGZ1bmN0aW9uYWxpdHkgRlJPTSBnZW5lcmFsX2NhdGFsb2cnLAogICAgKTsKCiAgICBteSBATGlzdDsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbmV4dCBST1cgaWYgISRSb3dbMV07CgogICAgICAgIHB1c2ggQExpc3QsIFxAUm93OwogICAgfQoKICAgICMgc2F2ZSBlbnRyaWVzIGluIG5ldyB0YWJsZQogICAgZm9yIG15ICRFbnRyeSAoQExpc3QpIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PgogICAgICAgICAgICAgICAgJ0lOU0VSVCBJTlRPIGdlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyggZ2VuZXJhbF9jYXRhbG9nX2lkLCBwcmVmX2tleSwgcHJlZl92YWx1ZSApJwogICAgICAgICAgICAgICAgLiAnIFZBTFVFUyggPywgXCdGdW5jdGlvbmFsaXR5XCcsID8gKScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEVudHJ5LT5bMF0sIFwkRW50cnktPlsxXSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBkcm9wIGNvbHVtbiBmdW5jdGlvbmFsaXR5CiAgICBteSAoJERyb3ApID0gJFNlbGYtPntEQk9iamVjdH0tPlNRTFByb2Nlc3NvcigKICAgICAgICBEYXRhYmFzZSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlQWx0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnZ2VuZXJhbF9jYXRhbG9nJywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGFnICAgICA9PiAnQ29sdW1uRHJvcCcsCiAgICAgICAgICAgICAgICBOYW1lICAgID0+ICdmdW5jdGlvbmFsaXR5JywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGFnICAgICA9PiAnVGFibGVBbHRlcicsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdFbmQnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICApOwoKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJERyb3AsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAo=