GeneralCatalog
1.1.1
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Build for OTRS::ITSM 1.1.1.
Build for OTRS::ITSM 1.1.0 rc1.
Build for OTRS::ITSM 1.1.0 beta4.
Build for OTRS::ITSM 1.1.0 beta3.
Build for OTRS::ITSM 1.1.0 beta2.
Build for OTRS::ITSM 1.1.0 beta1.
Testbuild for OTRS::ITSM 1.1.0 beta1.
The general catalog package.
Das General Catalog Paket.
2.2.6
2.2.x CVS
<br>
WELCOME<br>
<br>
You are about to install the OTRS module GeneralCatalog.<br>
<br>
<br>
ATTENTION<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul GeneralCatalog zu installieren.<br>
<br>
<br>
ACHTUNG<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WELCOME<br>
<br>
You are about to upgrade the OTRS module GeneralCatalog.<br>
<br>
<br>
ATTENTION<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul GeneralCatalog zu aktualisieren.<br>
<br>
<br>
ACHTUNG<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
2008-05-04 16:25:03
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBHZW5lcmFsQ2F0YWxvZy54bWwsdiAxLjMgMjAwOC8wMS8yMyAwODo1ODoyNiBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluR2VuZXJhbENhdGFsb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5HZW5lcmFsQ2F0YWxvZyBLb25maWd1cmF0aW9uIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5HZW5lcmFsIENhdGFsb2c8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+R2VuZXJhbCBDYXRhbG9nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazM8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGJnX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS42IDIwMDgvMDMvMTkgMTU6MDY6NDIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAoJFNlbGYpID0gQF87CiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnzvHt7uLl7SDq4PLg6+7jJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn0+/w4OLr5e3o5SDt4CDu8e3u4u3o/yDq4PLg6+7jJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnyuvg8e7i5SDiIOrg8uDr7uPgJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnxO7h4OLoIO3u4iDq6+DxIOIg6uDy4Ovu4+AuJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnxO7h4OLoIOXr5ezl7fIg6vrsIOrg8uDr7uPgJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnxO7h4OLoIOrr4PEg4iDq4PLg6+7j4Cc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ9Tz7er26O7t4Ovt7vHyJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogY3pfR2VuZXJhbENhdGFsb2cucG0sdiAxLjUgMjAwOC8wMy8xOSAxNTowNjo0MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICgkU2VsZikgPSBAXzsKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdWxaFlb2JlY27DvSBrYXRhbG9nJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnxZjDrXplbsOtIHbFoWVvYmVjbsOpaG8ga2F0YWxvZ3UnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICdUxZnDrWR5IHYga2F0YWxvZ3UnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdQxZlpZGF0IG5vdm91IHTFmcOtZHUgZG8ga2F0YWxvZ3UuJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnUMWZaWRhdCBwcnZlayBkbyBrYXRhbG9ndSc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ1DFmWlkYXQgdMWZw61kdSBkbyBrYXRhbG9ndSc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0Z1bmtjaW9uYWxpdGEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xMiAyMDA4LzAzLzE5IDE1OjA2OjQyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEyICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICgkU2VsZikgPSBAXzsKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdHZW5lcmFsIENhdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0thdGFsb2cgS2xhc3NlJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnRWluZSBuZXVlIEthdGFsb2cgS2xhc3NlIGhpbnp1ZvxnZW4uJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnS2F0YWxvZyBFaW50cmFnIGhpbnp1ZvxnZW4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdLYXRhbG9nIEtsYXNzZSBoaW56dWb8Z2VuJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVua3Rpb25hbGl05HQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMjEgMjAwOC8wMy8wNiAxNDoyODowNCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIxICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBsaXN0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUxpc3QnICkgewogICAgICAgIG15ICRDbGFzcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzIiApIHx8ICcnOwoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBjbGFzcwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKSBpZiAhJENsYXNzOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ICAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SXRlbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGF2YWlsYWJpbGl0eSBsaXN0CiAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKCiAgICAgICAgIyBnZXQgY2F0YWxvZyBpdGVtIGxpc3QKICAgICAgICBteSAkSXRlbUlETGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgICAgICBWYWxpZCA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBsaXN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKQogICAgICAgICAgICBpZiAhJEl0ZW1JRExpc3QgfHwgISV7JEl0ZW1JRExpc3R9OwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBmb3IgbXkgJEl0ZW1JRCAoIHNvcnQgeyAkSXRlbUlETGlzdC0+eyRhfSBjbXAgJEl0ZW1JRExpc3QtPnskYn0gfSBrZXlzICV7JEl0ZW1JRExpc3R9ICkgewoKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNoYWN0aXZlJyA/ICdzZWFyY2hwYXNzaXZlJyA6ICdzZWFyY2hhY3RpdmUnOwoKICAgICAgICAgICAgIyBnZXQgaXRlbSBkYXRhCiAgICAgICAgICAgIG15ICRJdGVtRGF0YSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBpdGVtIGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SXRlbUxpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskSXRlbURhdGF9LAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzICAgICAgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJEl0ZW1EYXRhLT57RnVuY3Rpb25hbGl0eX0gfHwgJy0nLAogICAgICAgICAgICAgICAgICAgIFZhbGlkICAgICAgICAgPT4gJFZhbGlkTGlzdHsgJEl0ZW1EYXRhLT57VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2F0YWxvZyBpdGVtIGVkaXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJdGVtRWRpdCcgKSB7CiAgICAgICAgbXkgJUl0ZW1EYXRhOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAkSXRlbURhdGF7SXRlbUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkl0ZW1JRCIgKTsKICAgICAgICBpZiAoICRJdGVtRGF0YXtJdGVtSUR9IGVxICdORVcnICkgewoKICAgICAgICAgICAgIyBnZXQgY2xhc3MKICAgICAgICAgICAgJEl0ZW1EYXRhe0NsYXNzfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzIiApOwoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldwogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkKICAgICAgICAgICAgICAgIGlmICEkSXRlbURhdGF7Q2xhc3N9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZ2V0IGl0ZW0gZGF0YQogICAgICAgICAgICBteSAkSXRlbURhdGFSZWYgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaXRlbSBkYXRhCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkKICAgICAgICAgICAgICAgIGlmICEkSXRlbURhdGFSZWY7CgogICAgICAgICAgICAlSXRlbURhdGEgPSAleyRJdGVtRGF0YVJlZn07CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIENsYXNzT3B0aW9uU3RyZwogICAgICAgIG15ICRDbGFzc0xpc3QgICAgICAgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7CiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmdW5jdGlvbmFsaXR5IGxpc3QKICAgICAgICBteSAkRnVuY3Rpb25hbGl0eVJlZiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5GdW5jdGlvbmFsaXR5TGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgZnVuY3Rpb25hbGl0eSBsaXN0CiAgICAgICAgbXkgJUZ1bmN0aW9uYWxpdHlMaXN0OwogICAgICAgIGZvciBteSAkRnVuY3Rpb25hbGl0eSAoIEB7JEZ1bmN0aW9uYWxpdHlSZWZ9ICkgewogICAgICAgICAgICAkRnVuY3Rpb25hbGl0eUxpc3R7JEZ1bmN0aW9uYWxpdHl9ID0gJEZ1bmN0aW9uYWxpdHkgfHwgJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICElRnVuY3Rpb25hbGl0eUxpc3QgKSB7CiAgICAgICAgICAgICVGdW5jdGlvbmFsaXR5TGlzdCA9ICgKICAgICAgICAgICAgICAgICcnID0+ICctJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgRnVuY3Rpb25hbGl0eU9wdGlvblN0cmcKICAgICAgICBteSAkRnVuY3Rpb25hbGl0eU9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlRnVuY3Rpb25hbGl0eUxpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRJdGVtRGF0YXtGdW5jdGlvbmFsaXR5fSB8fCAnJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwogICAgICAgIG15ICRWYWxpZE9wdGlvblN0cmcgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEl0ZW1EYXRhe1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBJdGVtRWRpdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1FZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBGdW5jdGlvbmFsaXR5T3B0aW9uU3RyZyA9PiAkRnVuY3Rpb25hbGl0eU9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBWYWxpZE9wdGlvblN0cmcgICAgICAgICA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJEl0ZW1EYXRhe0NsYXNzfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NBZGQKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1FZGl0Q2xhc3NBZGQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXRDbGFzc0V4aXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdENsYXNzRXhpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbVNhdmUnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ2xhc3MgSXRlbUlEIE5hbWUgRnVuY3Rpb25hbGl0eSBWYWxpZElEIENvbW1lbnQpKSB7CiAgICAgICAgICAgICRJdGVtRGF0YXskUGFyYW19ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgY2xhc3MKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkKICAgICAgICAgICAgaWYgISRJdGVtRGF0YXtDbGFzc30gfHwgJEl0ZW1EYXRhe0NsYXNzfSBlcSAnTkVXJzsKCiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgbXkgJFN1Y2Nlc3M7CiAgICAgICAgaWYgKCAkSXRlbURhdGF7SXRlbUlEfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtVXBkYXRlKAogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkgaWYgISRTdWNjZXNzOwoKICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3IGNsYXNzIGxpc3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUl0ZW1MaXN0JkNsYXNzPSRJdGVtRGF0YXtDbGFzc30iCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgY2F0YWxvZyBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCAgICAgICA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc0xpc3QoKTsKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0NsYXNzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgZm9yIG15ICRDbGFzcyAoIEB7JENsYXNzTGlzdH0gKSB7CgogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBjbGFzcyBsaXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0NsYXNzTGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5HZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbkdlbmVyYWxDYXRhbG9nLmR0bCx2IDEuNiAyMDA4LzAxLzI4IDE0OjU4OjQ1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkdlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtRWRpdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iTkVXIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgQ2F0YWxvZyBJdGVtIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ2xhc3NPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbUVkaXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9Ik5FVyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSJORVciPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBDYXRhbG9nIENsYXNzIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4ifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3MgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNjAlIj4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzTGlzdCAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUl0ZW1MaXN0JkNsYXNzPSRMUURhdGF7IkNsYXNzIn0iPgogICAgICAgICAgICAgICAgICAkUURhdGF7IkNsYXNzIn0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzTGlzdCAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzcyAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdJdGVtIC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikxpc3QifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjYwJSI+JFFEYXRheyJDbGFzcyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgYWxpZ249ImNlbnRlciI+JFRleHR7IkZ1bmN0aW9uYWxpdHkifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPiRUZXh0eyJWYWxpZCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0l0ZW1MaXN0IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249SXRlbUVkaXQmSXRlbUlEPSRRRGF0YXsiSXRlbUlEIn0iPgogICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAkUURhdGF7IkZ1bmN0aW9uYWxpdHkifQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiVmFsaWQifSJ9CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXQgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbVNhdmUiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IiRRRGF0YXsiSXRlbUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikl0ZW0ifSAkVGV4dHsiRWRpdCJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzQWRkIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRhbG9nIENsYXNzIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ2xhc3MiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMTAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkl0ZW1FZGl0Q2xhc3NBZGQgLS0+CjwhLS0gZHRsOmJsb2NrOkl0ZW1FZGl0Q2xhc3NFeGlzdCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJDbGFzcyJ9CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSIkUURhdGF7IkNsYXNzIn0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0V4aXN0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIxMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRnVuY3Rpb25hbGl0eSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkZ1bmN0aW9uYWxpdHlPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWxpZE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdCAtLT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2cucG0sdiAxLjM1IDIwMDgvMDQvMDQgMTA6MjA6NTEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zNSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nIC0gZ2VuZXJhbCBjYXRhbG9nIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ2xhc3NMaXN0KCkKCnJldHVybiBhbiBhcnJheSByZWZlcmVuY2Ugb2YgYWxsIGdlbmVyYWwgY2F0YWxvZyBjbGFzc2VzCgogICAgbXkgJEFycmF5UmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5DbGFzc0xpc3QoKTsKCj1jdXQKCnN1YiBDbGFzc0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1QoZ2VuZXJhbF9jYXRhbG9nX2NsYXNzKSAnCiAgICAgICAgICAgIC4gJ0ZST00gZ2VuZXJhbF9jYXRhbG9nIE9SREVSIEJZIGdlbmVyYWxfY2F0YWxvZ19jbGFzcycsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQENsYXNzTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ2xhc3NMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQENsYXNzTGlzdDsKfQoKPWl0ZW0gQ2xhc3NSZW5hbWUoKQoKcmVuYW1lIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCgogICAgbXkgJFRydWUgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICdJVFNNOjpDb25maWdJdGVtOjpTdGF0ZScsCiAgICAgICAgQ2xhc3NOZXcgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKPWN1dAoKc3ViIENsYXNzUmVuYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzT2xkIENsYXNzTmV3KSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcXVvdGUKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzT2xkIENsYXNzTmV3KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSApOwogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMgKHJlcGxhY2UgaXQgd2l0aCBTdHJpbmdDbGVhbigpIGluIE9UUlMgMi4zIGFuZCBsYXRlcikKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzT2xkIENsYXNzTmV3KSkgewogICAgICAgICRTZWxmLT5fU3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtDbGFzc05ld30gZXEgJFBhcmFte0NsYXNzT2xkfTsKCiAgICAjIGNoZWNrIGlmIG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAiU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ICckUGFyYW17Q2xhc3NOZXd9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQWxyZWFkeUV4aXN0cyA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBbHJlYWR5RXhpc3RzID0gMTsKICAgIH0KCiAgICBpZiAoJEFscmVhZHlFeGlzdHMpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHJlbmFtZSBjbGFzcyAkUGFyYW17Q2xhc3NPbGR9ISBOZXcgY2xhc3NuYW1lIGFscmVhZHkgZXhpc3RzLiIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntJdGVtR2V0fS0+e0NsYXNzfS0+eyAkUGFyYW17Q2xhc3NPbGR9IH07CiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntJdGVtR2V0fS0+e0NsYXNzfS0+eyAkUGFyYW17Q2xhc3NOZXd9IH07CiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntJdGVtR2V0fS0+e0l0ZW1JRH07CiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntJdGVtTGlzdH07CgogICAgIyByZW5hbWUgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiVVBEQVRFIGdlbmVyYWxfY2F0YWxvZyBTRVQgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gJyRQYXJhbXtDbGFzc05ld30nICIKICAgICAgICAgICAgLiAiV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gJyRQYXJhbXtDbGFzc09sZH0nIiwKICAgICk7Cn0KCj1pdGVtIEl0ZW1MaXN0KCkKCnJldHVybiBhIGxpc3QgYXMgaGFzaCByZWZlcmVuY2Ugb2Ygb25lIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwoKICAgIG15ICRIYXNoUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdhY3RpdmUnLCAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBzdHJpbmcgb3IgYXJyYXkgcmVmZXJlbmNlCiAgICAgICAgVmFsaWQgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHF1b3RlCiAgICAkUGFyYW17Q2xhc3N9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q2xhc3N9ICk7CiAgICAkUGFyYW17VmFsaWR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17VmFsaWR9LCAnSW50ZWdlcicgKTsKCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgbmFtZSBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSAnJFBhcmFte0NsYXNzfScgIjsKCiAgICAjIGFkZCB2YWxpZCBzdHJpbmcgdG8gc3FsIHN0cmluZwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9IHx8ICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIHZhbGlkX2lkID0gMSAnOwogICAgfQoKICAgICMgYWRkIGZ1bmN0aW9uYWxpdHkgdG8gc3FsIHN0cmluZwogICAgaWYgKCAkUGFyYW17RnVuY3Rpb25hbGl0eX0gKSB7CgogICAgICAgICMgY3JlYXRlIGFycmF5IHJlZmVyZW5jZSwgaWYgZnVuY3Rpb25hbGl0eSBpcyBnaXZlIGFzIHN0aW5nCiAgICAgICAgaWYgKCByZWYgJFBhcmFte0Z1bmN0aW9uYWxpdHl9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRQYXJhbXtGdW5jdGlvbmFsaXR5fSA9IFsgJFBhcmFte0Z1bmN0aW9uYWxpdHl9IF07CiAgICAgICAgfQoKICAgICAgICAjIHF1b3RlIGVhY2ggZWxlbWVudCBhbmQgY3JlYXRlIGZ1bmN0aW9uYWxpdHkgc3RyaW5nCiAgICAgICAgbXkgJEZ1bmN0aW9uYWxpdHlTdHJpbmcgPSBqb2luIHF7JywgJ30sCiAgICAgICAgICAgIG1hcCB7ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkXykgfSBAeyAkUGFyYW17RnVuY3Rpb25hbGl0eX0gfTsKCiAgICAgICAgIyBhZGQgZnVuY3Rpb25hbGl0eSBzdHJpbmcgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gIkFORCBmdW5jdGlvbmFsaXR5IElOICgnJEZ1bmN0aW9uYWxpdHlTdHJpbmcnKSI7CiAgICB9CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1MaXN0fS0+eyRTUUx9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntJdGVtTGlzdH0tPnskU1FMfTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyBjaGVjayBpdGVtCiAgICBpZiAoICElRGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NsYXNzIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntJdGVtTGlzdH0tPnskU1FMfSA9IFwlRGF0YTsKCiAgICByZXR1cm4gXCVEYXRhOwp9Cgo9aXRlbSBGdW5jdGlvbmFsaXR5TGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIG9mIGFsbCBmdW5jdGlvbmFsaXRpZXMgb2YgYSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKCiAgICBteSAkQXJyYXlSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkZ1bmN0aW9uYWxpdHlMaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICk7Cgo9Y3V0CgpzdWIgRnVuY3Rpb25hbGl0eUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3MhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcXVvdGUKICAgICRQYXJhbXtDbGFzc30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtDbGFzc30gKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgRElTVElOQ1QoZnVuY3Rpb25hbGl0eSkgRlJPTSBnZW5lcmFsX2NhdGFsb2cgIgogICAgICAgICAgICAuICJXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSAnJFBhcmFte0NsYXNzfScgT1JERVIgQlkgZnVuY3Rpb25hbGl0eSIKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBARnVuY3Rpb25hbGl0eUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRSb3dbMF0gfHw9ICcnOwogICAgICAgIHB1c2ggQEZ1bmN0aW9uYWxpdHlMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQEZ1bmN0aW9uYWxpdHlMaXN0Owp9Cgo9aXRlbSBJdGVtR2V0KCkKCmdldCBhIGdlbmVyYWwgY2F0YWxvZyBpdGVtCgpSZXR1cm4KICAgICRJdGVtRGF0YXtJdGVtSUR9CiAgICAkSXRlbURhdGF7Q2xhc3N9CiAgICAkSXRlbURhdGF7TmFtZX0KICAgICRJdGVtRGF0YXtGdW5jdGlvbmFsaXR5fQogICAgJEl0ZW1EYXRhe1ZhbGlkSUR9CiAgICAkSXRlbURhdGF7Q29tbWVudH0KICAgICRJdGVtRGF0YXtDcmVhdGVUaW1lfQogICAgJEl0ZW1EYXRhe0NyZWF0ZUJ5fQogICAgJEl0ZW1EYXRhe0NoYW5nZVRpbWV9CiAgICAkSXRlbURhdGF7Q2hhbmdlQnl9CgogICAgbXkgJEl0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCAgPT4gMywKICAgICk7CgogICAgb3IKCiAgICBteSAkSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgID0+ICdJdGVtIE5hbWUnLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtSUR9ICYmICggISRQYXJhbXtDbGFzc30gfHwgISRQYXJhbXtOYW1lfSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtSUQgT1IgQ2xhc3MgYW5kIE5hbWUhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCBnZW5lcmFsX2NhdGFsb2dfY2xhc3MsIG5hbWUsIGZ1bmN0aW9uYWxpdHksIHZhbGlkX2lkLCBjb21tZW50cywgIgogICAgICAgIC4gImNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgIjsKCiAgICAjIGFkZCBvcHRpb25zIHRvIHNxbCBzdHJpbmcKICAgIGlmICggJFBhcmFte0NsYXNzfSAmJiAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICAgICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntDbGFzc30tPnsgJFBhcmFte0NsYXNzfSB9LT57ICRQYXJhbXtOYW1lfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntDbGFzc30tPnsgJFBhcmFte0NsYXNzfSB9LT57ICRQYXJhbXtOYW1lfSB9OwoKICAgICAgICAjIHF1b3RlCiAgICAgICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MgTmFtZSkpIHsKICAgICAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBjbGFzcyBhbmQgbmFtZSB0byBzcWwgc3RyaW5nCiAgICAgICAgJFNRTCAuPSAiZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gJyRQYXJhbXtDbGFzc30nIEFORCBuYW1lID0gJyRQYXJhbXtOYW1lfSciOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICAgICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntJdGVtSUR9LT57ICRQYXJhbXtJdGVtSUR9IH0KICAgICAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntJdGVtR2V0fS0+e0l0ZW1JRH0tPnsgJFBhcmFte0l0ZW1JRH0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtJdGVtSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17SXRlbUlEfSwgJ0ludGVnZXInICk7CgogICAgICAgICMgYWRkIGl0ZW0gaWQgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gImlkID0gJFBhcmFte0l0ZW1JRH0iOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUl0ZW1EYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSXRlbURhdGF7SXRlbUlEfSAgICAgICAgPSAkUm93WzBdOwogICAgICAgICRJdGVtRGF0YXtDbGFzc30gICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJEl0ZW1EYXRhe05hbWV9ICAgICAgICAgID0gJFJvd1syXTsKICAgICAgICAkSXRlbURhdGF7RnVuY3Rpb25hbGl0eX0gPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRJdGVtRGF0YXtWYWxpZElEfSAgICAgICA9ICRSb3dbNF07CiAgICAgICAgJEl0ZW1EYXRhe0NvbW1lbnR9ICAgICAgID0gJFJvd1s1XSB8fCAnJzsKICAgICAgICAkSXRlbURhdGF7Q3JlYXRlVGltZX0gICAgPSAkUm93WzZdOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVCeX0gICAgICA9ICRSb3dbN107CiAgICAgICAgJEl0ZW1EYXRhe0NoYW5nZVRpbWV9ICAgID0gJFJvd1s4XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlQnl9ICAgICAgPSAkUm93WzldOwogICAgfQoKICAgICMgY2hlY2sgaXRlbQogICAgaWYgKCAhJEl0ZW1EYXRhe0l0ZW1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJdGVtIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntJdGVtR2V0fS0+e0NsYXNzfS0+eyAkSXRlbURhdGF7Q2xhc3N9IH0tPnsgJEl0ZW1EYXRhe05hbWV9IH0gPSBcJUl0ZW1EYXRhOwogICAgJFNlbGYtPntDYWNoZX0tPntJdGVtR2V0fS0+e0l0ZW1JRH0tPnsgJFBhcmFte0l0ZW1JRH0gfSA9IFwlSXRlbURhdGE7CgogICAgcmV0dXJuIFwlSXRlbURhdGE7Cn0KCj1pdGVtIEl0ZW1BZGQoKQoKYWRkIGEgbmV3IGdlbmVyYWwgY2F0YWxvZyBpdGVtCgogICAgbXkgJEl0ZW1JRCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdJdGVtIE5hbWUnLAogICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ0Z1bmMzJywgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEZ1bmN0aW9uYWxpdHkgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRQYXJhbXskQXJndW1lbnR9IHx8ICcnOwogICAgfQoKICAgICMgcXVvdGUKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzIE5hbWUgRnVuY3Rpb25hbGl0eSBDb21tZW50KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zIChyZXBsYWNlIGl0IHdpdGggU3RyaW5nQ2xlYW4oKSBpbiBPVFJTIDIuMyBhbmQgbGF0ZXIpCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcyBGdW5jdGlvbmFsaXR5KSkgewogICAgICAgICRTZWxmLT5fU3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT5fU3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmluZCBleGl0aW5nIGl0ZW0gd2l0aCBzYW1lIG5hbWUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAiU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nICIKICAgICAgICAgICAgLiAiV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gJyRQYXJhbXtDbGFzc30nIEFORCBuYW1lID0gJyRQYXJhbXtOYW1lfSciLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROb0FkZCA9IDE7CiAgICB9CgogICAgIyBhYm9ydCBpbnNlcnQgb2YgbmV3IGl0ZW0sIGlmIGl0ZW0gbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCROb0FkZCkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyBpdGVtISBHZW5lcmFsIGNhdGFsb2cgaXRlbSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUxpc3R9OwoKICAgICMgaW5zZXJ0IG5ldyBpdGVtCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGdlbmVyYWxfY2F0YWxvZyAiCiAgICAgICAgICAgIC4gIihnZW5lcmFsX2NhdGFsb2dfY2xhc3MsIG5hbWUsIGZ1bmN0aW9uYWxpdHksIHZhbGlkX2lkLCBjb21tZW50cywgIgogICAgICAgICAgICAuICJjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgIgogICAgICAgICAgICAuICIoJyRQYXJhbXtDbGFzc30nLCAnJFBhcmFte05hbWV9JywgIgogICAgICAgICAgICAuICInJFBhcmFte0Z1bmN0aW9uYWxpdHl9JywgJFBhcmFte1ZhbGlkSUR9LCAnJFBhcmFte0NvbW1lbnR9JywgIgogICAgICAgICAgICAuICJjdXJyZW50X3RpbWVzdGFtcCwgJFBhcmFte1VzZXJJRH0sIGN1cnJlbnRfdGltZXN0YW1wLCAkUGFyYW17VXNlcklEfSkiCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgaXRlbQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgIgogICAgICAgICAgICAuICJXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSAnJFBhcmFte0NsYXNzfScgQU5EIG5hbWUgPSAnJFBhcmFte05hbWV9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJEl0ZW1JRDsKfQoKPWl0ZW0gSXRlbVVwZGF0ZSgpCgp1cGRhdGUgYSBleGlzdGluZyBnZW5lcmFsIGNhdGFsb2cgaXRlbQoKICAgIG15ICRUcnVlID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnRnVuYzMnLCAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgICAgID0+ICdDb21tZW50JywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhGdW5jdGlvbmFsaXR5IENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkUGFyYW17JEFyZ3VtZW50fSB8fCAnJzsKICAgIH0KCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIEZ1bmN0aW9uYWxpdHkgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0gKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMgKHJlcGxhY2UgaXQgd2l0aCBTdHJpbmdDbGVhbigpIGluIE9UUlMgMi4zIGFuZCBsYXRlcikKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzIEZ1bmN0aW9uYWxpdHkpKSB7CiAgICAgICAgJFNlbGYtPl9TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPl9TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2xhc3Mgb2YgaXRlbQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzLCBmdW5jdGlvbmFsaXR5IEZST00gZ2VuZXJhbF9jYXRhbG9nICIKICAgICAgICAgICAgLiAiV0hFUkUgaWQgPSAkUGFyYW17SXRlbUlEfSIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ2xhc3M7CiAgICBteSAkT2xkRnVuY3Rpb25hbGl0eTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENsYXNzID0gJFJvd1swXTsKICAgICAgICAkT2xkRnVuY3Rpb25hbGl0eSA9ICRSb3dbMV0gfHwgJyc7CiAgICB9CgogICAgaWYgKCAhJENsYXNzICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIG5vdCBmb3VuZCBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgJENsYXNzICAgICAgICAgICAgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJENsYXNzKTsKICAgICRPbGRGdW5jdGlvbmFsaXR5ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRPbGRGdW5jdGlvbmFsaXR5KTsKCiAgICAjIGZpbmQgZXhpdGluZyBpdGVtIHdpdGggc2FtZSBuYW1lCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyAiCiAgICAgICAgICAgIC4gIldIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ICckQ2xhc3MnIEFORCBuYW1lID0gJyRQYXJhbXtOYW1lfSciLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFVwZGF0ZSA9IDE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFBhcmFte0l0ZW1JRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCB1cGRhdGUgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY291bnQgdGhlIGZ1bmN0aW9uYWxpdHkKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIENPVU5UKGZ1bmN0aW9uYWxpdHkpIEZST00gZ2VuZXJhbF9jYXRhbG9nICIKICAgICAgICAgICAgLiAiV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gJyRDbGFzcycgQU5EIGZ1bmN0aW9uYWxpdHkgPSAnJE9sZEZ1bmN0aW9uYWxpdHknIiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRMYXN0RnVuY3Rpb25hbGl0eSA9IDE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA+IDEgfHwgJFBhcmFte0Z1bmN0aW9uYWxpdHl9IGVxICRPbGRGdW5jdGlvbmFsaXR5ICkgewogICAgICAgICAgICAkTGFzdEZ1bmN0aW9uYWxpdHkgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFib3J0IHVwZGF0ZSwgaWYgZnVuY3Rpb25hbGl0eSBpcyB0aGUgbGFzdCBvbmUKICAgIGlmICgkTGFzdEZ1bmN0aW9uYWxpdHkpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IHVwZGF0ZSBpdGVtISBUaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGl0ZW0gaXMgdGhlIGxhc3QgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57Q2xhc3N9LT57JENsYXNzfS0+eyAkUGFyYW17TmFtZX0gfTsKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57SXRlbUlEfS0+eyAkUGFyYW17SXRlbUlEfSB9OwogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUxpc3R9OwoKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgZ2VuZXJhbF9jYXRhbG9nIFNFVCAiCiAgICAgICAgICAgIC4gIm5hbWUgPSAnJFBhcmFte05hbWV9JywgZnVuY3Rpb25hbGl0eSA9ICckUGFyYW17RnVuY3Rpb25hbGl0eX0nLCIKICAgICAgICAgICAgLiAidmFsaWRfaWQgPSAkUGFyYW17VmFsaWRJRH0sIGNvbW1lbnRzID0gJyRQYXJhbXtDb21tZW50fScsICIKICAgICAgICAgICAgLiAiY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gJFBhcmFte1VzZXJJRH0gIgogICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRQYXJhbXtJdGVtSUR9IiwKICAgICk7Cn0KCj1pdGVtIF9TdHJpbmdDbGVhbigpCgpET04nVCBVU0UgVEhJUyBJTlRFUk5BTCBGVU5DVElPTiBJTiBPVEhFUiBNT0RVTEVTIQoKVGhpcyBmdW5jdGlvbiBjYW4gYmUgcmVwbGFjZWQgd2l0aCBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOjpTdHJpbmdDbGVhbigpIGluIE9UUlMgMi4zIGFuZCBsYXRlciEKCmNsZWFuIGEgZ2l2ZW4gc3RyaW5nCgogICAgbXkgJEVycm9yID0gJENoZWNrSXRlbU9iamVjdC0+X1N0cmluZ0NsZWFuKAogICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwnU3RyaW5nJywKICAgICAgICBUcmltTGVmdCAgICAgICAgICA9PiAwLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgICAgIFRyaW1SaWdodCAgICAgICAgID0+IDAsICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAKICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMAogICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICApOwoKPWN1dAoKc3ViIF9TdHJpbmdDbGVhbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtTdHJpbmdSZWZ9IHx8IHJlZiAkUGFyYW17U3RyaW5nUmVmfSBuZSAnU0NBTEFSJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgYSBzY2FsYXIgcmVmZXJlbmNlIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAhJHsgJFBhcmFte1N0cmluZ1JlZn0gfTsKCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgJFBhcmFte1RyaW1MZWZ0fSAgPSBkZWZpbmVkICRQYXJhbXtUcmltTGVmdH0gID8gJFBhcmFte1RyaW1MZWZ0fSAgOiAxOwogICAgJFBhcmFte1RyaW1SaWdodH0gPSBkZWZpbmVkICRQYXJhbXtUcmltUmlnaHR9ID8gJFBhcmFte1RyaW1SaWdodH0gOiAxOwoKICAgIG15ICVUcmltQWN0aW9uID0gKAogICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IHFyeyBbXG5cclxmXSB9eG1zLAogICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IHFyeyBcdCAgICAgICB9eG1zLAogICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IHFyeyBbIF0gICAgICB9eG1zLAogICAgICAgIFRyaW1MZWZ0ICAgICAgICAgID0+IHFyeyBcQSBccysgICB9eG1zLAogICAgICAgIFRyaW1SaWdodCAgICAgICAgID0+IHFyeyBccysgXHogICB9eG1zLAogICAgKTsKCiAgICBBQ1RJT046CiAgICBmb3IgbXkgJEFjdGlvbiAoIHNvcnQga2V5cyAlVHJpbUFjdGlvbiApIHsKICAgICAgICBuZXh0IEFDVElPTiBpZiAhJFBhcmFteyRBY3Rpb259OwoKICAgICAgICAkeyAkUGFyYW17U3RyaW5nUmVmfSB9ID1+IHN7ICRUcmltQWN0aW9ueyRBY3Rpb259IH17fXhtc2c7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMzUgJCAkRGF0ZTogMjAwOC8wNC8wNCAxMDoyMDo1MSAkCgo9Y3V0Cg==
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnQgLSBnZW5lcmFsIGNhdGFsb2cgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnQsdiAxLjE3IDIwMDgvMDMvMTkgMTU6MDY6MTQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCiRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyggJXskU2VsZn0gKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBuZWVkZWQgdXNlcnMKbXkgQFVzZXJJRHM7CnsKCiAgICAjIGRpc2FibGUgZW1haWwgY2hlY2tzIHRvIGNyZWF0ZSBuZXcgdXNlcgogICAgbXkgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hlY2tFbWFpbEFkZHJlc3NlcycpIHx8IDE7CiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gMCwKICAgICk7CgogICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAyICkgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgICAgIG15ICRVc2VySUQgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyQWRkKAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdHZW5lcmFsQ2F0YWxvZycgLiAkQ291bnRlciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1HZW5lcmFsQ2F0YWxvZy0nIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJ1VuaXRUZXN0LUdlbmVyYWxDYXRhbG9nLScgLiAkQ291bnRlciAuICdAbG9jYWxob3N0JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAVXNlcklEcywgJFVzZXJJRDsKICAgIH0KCiAgICAjIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKICAgICk7Cn0KCiMgY3JlYXRlIG5lZWRlZCByYW5kb20gY2xhc3NlcwpteSBAQ2xhc3NSYW5kOwoKZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgIHB1c2ggQENsYXNzUmFuZCwgaW50IHJhbmQgMV8wMDBfMDAwOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEl0ZW1EYXRhID0gWwoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICA9PiAnVGVzdEl0ZW0yJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW0zJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICcnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBvbmUgdGVzdCBiZWZvcmUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoRnVuYyAnJyBpcyB0aGUgbGFzdCBpbiB0aGlzIGNsYXNzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1Rlc3RJdGVtNFVQREFURTEnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdUZXN0JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0SXRlbTUnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdUZXN0MScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0SXRlbTUnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdUZXN0MScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ1Rlc3RJdGVtNVVQREFURTEnLAogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdDEnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChGdW5jICd0ZXN0MScgaXMgdGhlIGxhc3QgaW4gdGhpcyBjbGFzcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTUnLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChGdW5jICd0ZXN0MScgaXMgdGhlIGxhc3QgaW4gdGhpcyBjbGFzcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0SXRlbTUnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdUZXN0MicsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdDEnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMicsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ1Rlc3QxJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBhcmUgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMycsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ1Rlc3QxJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0SXRlbTVVUERBVEUzJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdDEnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICIgXHQgXG4gXHIgVW5pdCBUZXN0IDo6IFRlc3QgQ2xhc3MgXHQgXG4gXHIgIiAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gIiBcdCBcbiBcciBUZXN0IEl0ZW0gXHQgXG4gXHIgIiwKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAiIFx0IFxuIFxyIFRlc3QgRnVuY3Rpb25hbGl0eSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0IEl0ZW0nLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdUZXN0RnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnVGVzdCBDb21tZW50JywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAiIFx0IFxuIFxyIFRlc3QgSXRlbSBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gIiBcdCBcbiBcciBUZXN0IEZ1bmMgdGlvbmEgbGl0eSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1Rlc3QgSXRlbSBVUERBVEUxJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdEZ1bmN0aW9uYWxpdHknLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICdUZXN0IENvbW1lbnQgVVBEQVRFMScsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzwqknIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnIM+SIM+hIFRlc3QgSXRlbSDGqSDPniAnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICcg0aAg0aQgVGVzdEZ1bmN0aW9uYWxpdHkgz6AgzqkgJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICcgz6Ag0K8gVGVzdCBDb21tZW50INGsINGgICcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3PCqScgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICfPkiDPoSBUZXN0IEl0ZW0gxqkgz54nLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICfRoNGkVGVzdEZ1bmN0aW9uYWxpdHnPoM6pJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICfPoCDQryBUZXN0IENvbW1lbnQg0awg0aAnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0IEl0ZW0gxqkgyaQgVVBEQVRFMScsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJyDRoCDRpCBUZXN0RnVuY3Rpb25hbGl0eSDPoCDOqSAnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICcgVGVzdCBDb21tZW50INGZINGSIFVQREFURTEgJywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1Rlc3QgSXRlbSDGqSDJpCBVUERBVEUxJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAn0aDRpFRlc3RGdW5jdGlvbmFsaXR5z6DOqScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJ1Rlc3QgQ29tbWVudCDRmSDRkiBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGEgc2Vjb25kIGl0ZW0gd2l0aCBGdW5jdGlvbmFsaXR5ICd0ZXN0MScpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0SXRlbTYnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdUZXN0MScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0SXRlbTYnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdUZXN0MScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoc2V0IGZ1bmN0aW9uYWxpdHkgdG8gJycpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW02VVBEQVRFMScsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW02VVBEQVRFMScsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3NbdGVzdF0lKlxcJyAuICRDbGFzc1JhbmRbMV0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgSXRlbSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJyBbdGVzdF0lKlxcIFRlc3RGdW5jdGlvbmFsaXR5IFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzW3Rlc3RdJSpcXCcgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdbdGVzdF0lKlxcIFRlc3QgSXRlbSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnW3Rlc3RdJSpcXFRlc3RGdW5jdGlvbmFsaXR5W3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICcgW3Rlc3RdJSpcXCBUZXN0IEl0ZW0gVVBEQVRFMSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJyBbdGVzdF0lKlxcIFRlc3RGdW5jdGlvbmFsaXR5IFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnW3Rlc3RdJSpcXCBUZXN0IEl0ZW0gVVBEQVRFMSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnW3Rlc3RdJSpcXFRlc3RGdW5jdGlvbmFsaXR5W3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkVGVzdENvdW50ID0gMTsKbXkgJExhc3RBZGRlZEl0ZW1JRDsKbXkgJUFkZGVkSXRlbUNvdW50ZXI7Cgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CgogICAgaWYgKCAkSXRlbS0+e0FkZH0gKSB7CgogICAgICAgICMgYWRkIG5ldyBpdGVtCiAgICAgICAgbXkgJEl0ZW1JRCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtQWRkKAogICAgICAgICAgICAleyAkSXRlbS0+e0FkZH0gfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGl0ZW0gd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57QWRkR2V0fSApIHsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJEl0ZW1JRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1BZGQoKSAtIEl0ZW1LZXk6ICRJdGVtSUQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJdGVtSUQpIHsKCiAgICAgICAgICAgICAgICAjIHNldCBsYXN0IGl0ZW0gaWQgdmFyaWFibGUKICAgICAgICAgICAgICAgICRMYXN0QWRkZWRJdGVtSUQgPSAkSXRlbUlEOwoKICAgICAgICAgICAgICAgICMgaW5jcmVtZW50IHRoZSBhZGRlZCBpdGVtIGNvdW50ZXIKICAgICAgICAgICAgICAgICRBZGRlZEl0ZW1Db3VudGVyeyAkSXRlbS0+e0FkZEdldH0tPntDbGFzc30gfSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkSXRlbUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUFkZCgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGl0ZW0gZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0KICAgICAgICBteSAkSXRlbUdldCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57QWRkfS0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGRhdGEgYWZ0ZXIgY3JlYXRpb24gb2YgaXRlbQogICAgICAgIGZvciBteSAkSXRlbUF0dHJpYnV0ZSAoIGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRJdGVtR2V0LT57JEl0ZW1BdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gJEl0ZW1BdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57VXBkYXRlfSApIHsKCiAgICAgICAgIyBjaGVjayBsYXN0IGl0ZW0gaWQgdmFyYWlibGUKICAgICAgICBpZiAoICEkTGFzdEFkZGVkSXRlbUlEICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBJVEVNIElEIEdJVkVOIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBpdGVtCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgSXRlbUlEID0+ICRMYXN0QWRkZWRJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBpdGVtIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57VXBkYXRlR2V0fSApIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbVVwZGF0ZSgpIC0gSXRlbUtleTogJExhc3RBZGRlZEl0ZW1JRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGl0ZW0gZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGUKICAgICAgICBteSAkSXRlbUdldDIgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRMYXN0QWRkZWRJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e1VwZGF0ZX0tPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIHVwZGF0ZQogICAgICAgIGZvciBteSAkSXRlbUF0dHJpYnV0ZSAoIGtleXMgJXsgJEl0ZW0tPntVcGRhdGVHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRJdGVtR2V0Mi0+eyRJdGVtQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRJdGVtQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1HZXQoKSAtICRJdGVtQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMgZm9yIGxhdGVyIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCBhcnJheXMKbXkgJUV4aXN0aW5nQ2xhc3Nlc1RtcDsKSVRFTToKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewogICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e0FkZEdldH0tPntDbGFzc307CiAgICAkRXhpc3RpbmdDbGFzc2VzVG1weyAkSXRlbS0+e0FkZEdldH0tPntDbGFzc30gfSA9IDE7Cn0KbXkgQEV4aXN0aW5nQ2xhc3NlcyA9IHNvcnQga2V5cyAlRXhpc3RpbmdDbGFzc2VzVG1wOwoKbXkgJUV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1wOwpJVEVNOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CiAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPntGdW5jdGlvbmFsaXR5fSB8fD0gJyc7CiAgICAkRXhpc3RpbmdGdW5jdGlvbmFsaXRpZXNUbXB7ICRJdGVtLT57VXBkYXRlR2V0fS0+e0Z1bmN0aW9uYWxpdHl9IH0gPSAxOwp9Cm15IEBFeGlzdGluZ0Z1bmN0aW9uYWxpdGllcyA9IHNvcnQga2V5cyAlRXhpc3RpbmdGdW5jdGlvbmFsaXRpZXNUbXA7CgpteSBATm9uRXhpc3RpbmdDbGFzc2VzID0gKCAnVW5pdFRlc3Q6Ok5vRXhpc3RpbmdDbGFzczEnLCAnVW5pdFRlc3Q6Ok5vRXhpc3RpbmdDbGFzczInICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NMaXN0IHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkQ2xhc3NMaXN0MSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc0xpc3QoKTsKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkQ2xhc3NDb3VudCA9IDA7CiAgICBpZiAoICRDbGFzc0xpc3QxICYmIHJlZiAkQ2xhc3NMaXN0MSBlcSAnQVJSQVknICkgewogICAgICAgICRDbGFzc0NvdW50ID0gZ3JlcCB7ICRfIGVxICRDbGFzcyB9IEB7JENsYXNzTGlzdDF9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkQ2xhc3NDb3VudCwKICAgICAgICAxLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzTGlzdCgpIC0gJENsYXNzIGxpc3RlZCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJENsYXNzIChATm9uRXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJEl0ZW1MaXN0LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSAkQ2xhc3Mgbm90IGV4aXN0cyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgMgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBteSAkTGlzdENvdW50ID0gJ05VTEwnOwogICAgaWYgKCBkZWZpbmVkICRJdGVtTGlzdCAmJiByZWYgJEl0ZW1MaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAkTGlzdENvdW50ID0ga2V5cyAleyRJdGVtTGlzdH07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRMaXN0Q291bnQsCiAgICAgICAgJEFkZGVkSXRlbUNvdW50ZXJ7JENsYXNzfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gJENsYXNzIGNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRnVuY3Rpb25hbGl0eUxpc3QgdGVzdCAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICVGdW5jdGlvbmFsaXR5TGlzdDE7Cm1hcCB7ICRGdW5jdGlvbmFsaXR5TGlzdDF7JF99ID0gMSB9IEBFeGlzdGluZ0Z1bmN0aW9uYWxpdGllczsKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkRnVuY3Rpb25hbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+RnVuY3Rpb25hbGl0eUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRnVuY3Rpb25hbGl0eUxpc3QgJiYgcmVmICRGdW5jdGlvbmFsaXR5TGlzdCBlcSAnQVJSQVknLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEZ1bmN0aW9uYWxpdHlMaXN0KCkgLSByZXR1cm4gYSBhcnJheSByZWZlcmVuY2UiLAogICAgKTsKCiAgICBmb3IgbXkgJEZ1bmN0aW9uYWxpdHkgKCBAeyRGdW5jdGlvbmFsaXR5TGlzdH0gKSB7CiAgICAgICAgZGVsZXRlICRGdW5jdGlvbmFsaXR5TGlzdDF7JEZ1bmN0aW9uYWxpdHl9OwogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKJFNlbGYtPlRydWUoCiAgICAha2V5cyAlRnVuY3Rpb25hbGl0eUxpc3QxLAogICAgIlRlc3QgJFRlc3RDb3VudDogRnVuY3Rpb25hbGl0eUxpc3QoKSIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NSZW5hbWUgdGVzdCAxIChjaGVjayBub3JtYWwgcmVuYW1lKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpDTEFTUzoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRPbGRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzLAogICAgICAgIENsYXNzTmV3ID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gUmVuYW1lIGZhaWxlZCIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENMQVNTOwogICAgfQoKICAgIG15ICROZXdJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgaWYgKAogICAgICAgICEkT2xkSXRlbUxpc3QKICAgICAgICB8fCAhJE5ld0l0ZW1MaXN0CiAgICAgICAgfHwgcmVmICRPbGRJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICB8fCByZWYgJE5ld0l0ZW1MaXN0IG5lICdIQVNIJwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBJdGVtTGlzdCBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBPTERLRVk6CiAgICBmb3IgbXkgJE9sZEtleSAoIGtleXMgJXskT2xkSXRlbUxpc3R9ICkgewoKICAgICAgICBpZiAoICFleGlzdHMgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX0gKSB7CiAgICAgICAgICAgICROZXdJdGVtTGlzdC0+e0ZhaWxlZER1bW15fSA9IDE7CiAgICAgICAgICAgIG5leHQgT0xES0VZOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBPTERLRVkgaWYgJE9sZEl0ZW1MaXN0LT57JE9sZEtleX0gbmUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CgogICAgICAgIGRlbGV0ZSAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fTsKICAgIH0KCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAha2V5cyAleyROZXdJdGVtTGlzdH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMiAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCkNMQVNTOgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJE9sZEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgQ2xhc3NOZXcgPT4gJyAnIC4gJENsYXNzIC4gIlJFIE5BIE1FIDIgXG4gXHIgXHQgIiwKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gUmVuYW1lIGZhaWxlZCIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENMQVNTOwogICAgfQoKICAgIG15ICROZXdJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgaWYgKAogICAgICAgICEkT2xkSXRlbUxpc3QKICAgICAgICB8fCAhJE5ld0l0ZW1MaXN0CiAgICAgICAgfHwgcmVmICRPbGRJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICB8fCByZWYgJE5ld0l0ZW1MaXN0IG5lICdIQVNIJwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBJdGVtTGlzdCBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBPTERLRVk6CiAgICBmb3IgbXkgJE9sZEtleSAoIGtleXMgJXskT2xkSXRlbUxpc3R9ICkgewoKICAgICAgICBpZiAoICFleGlzdHMgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX0gKSB7CiAgICAgICAgICAgICROZXdJdGVtTGlzdC0+e0ZhaWxlZER1bW15fSA9IDE7CiAgICAgICAgICAgIG5leHQgT0xES0VZOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBPTERLRVkgaWYgJE9sZEl0ZW1MaXN0LT57JE9sZEtleX0gbmUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CgogICAgICAgIGRlbGV0ZSAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fTsKICAgIH0KCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAha2V5cyAleyROZXdJdGVtTGlzdH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMiAoaWRlbnRpY2FsIG5hbWUgdGVzdCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcyAuICdSRU5BTUUyJywKICAgICAgICBDbGFzc05ldyA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBvbGRuYW1lIGFuZCBuZXduYW1lIGlkZW50aWNhbCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMyAobmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtQWRkKAogICAgQ2xhc3MgICAgICAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzJdLAogICAgTmFtZSAgICAgICAgICA9PiAnRHVtbXknLAogICAgRnVuY3Rpb25hbGl0eSA9PiAnJywKICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgPT4gMSwKKTsKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgQ2xhc3NOZXcgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFsyXSwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBuZXcgY2xhc3MgbmFtZSBhbHJlYWR5IGV4aXN0cyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKMTsK