ImportExport
1.3.1
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 1.3.1.
The ImportExport package.
Das ImportExport Paket.
2.4.x
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
((enjoy))<br>
<br>
2009-07-27 10:09:16
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBJbXBvcnRFeHBvcnQucGwgLSBpbXBvcnQvZXhwb3J0IHNjcmlwdAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBsLHYgMS4xMCAyMDA5LzA1LzE4IDA5OjQyOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFGRkVSTyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiMgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMgb3Igc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgRmluZEJpbiBxdygkUmVhbEJpbik7CnVzZSBsaWIgZGlybmFtZSgkUmVhbEJpbik7CnVzZSBsaWIgZGlybmFtZSgkUmVhbEJpbikgLiAnL0tlcm5lbC9jcGFuLWxpYic7Cgp1c2UgR2V0b3B0OjpTdGQ7CnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04gJFJlYWxCaW4pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07CgojIGdldCBvcHRpb25zCm15ICVPcHRzOwpnZXRvcHQoICdobmFpbycsIFwlT3B0cyApOwoKaWYgKCAkT3B0c3tofSApIHsKCiAgICBwcmludCBTVERPVVQgIkltcG9ydEV4cG9ydC5wbCA8UmV2aXNpb24gJFZFUlNJT04+IC0gYSBpbXBvcnQvZXhwb3J0IHRvb2xcbiI7CiAgICBwcmludCBTVERPVVQgIkNvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy9cbiI7CiAgICBwcmludCBTVERPVVQgInVzYWdlOkltcG9ydEV4cG9ydC5wbCAtbiA8VGVtcGxhdGVOdW1iZXI+IC1hIGltcG9ydHxleHBvcnQgIjsKICAgIHByaW50IFNURE9VVCAiWy1pIDxTb3VyY2VGaWxlPl0gWy1vIDxEZXN0aW5hdGlvbkZpbGU+XVxuIjsKICAgIHByaW50IFNURE9VVCAiXG4iOwogICAgcHJpbnQgU1RET1VUICIgICBleGFtcGxlczpcbiI7CiAgICBwcmludCBTVERPVVQgIiAgICAgICBJbXBvcnRFeHBvcnQucGwgLW4gMDAwMDQgLWEgaW1wb3J0IC1pIC90bXAvaW1wb3J0LmNzdlxuIjsKICAgIHByaW50IFNURE9VVCAiICAgICAgIEltcG9ydEV4cG9ydC5wbCAtbiAwMDAwNCAtYSBleHBvcnQgLW8gL3RtcC9leHBvcnQuY3N2XG4iOwoKICAgIGV4aXQgMTsKfQoKIyBjaGVjayB0ZW1wYWx0ZSBudW1iZXIKaWYgKCAhJE9wdHN7bn0gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBOZWVkIC1uIFRlbXBsYXRlTnVtYmVyXG4iOwogICAgZXhpdCAxOwp9CmlmICggJE9wdHN7bn0gIX4gbXsgXEEgXGQrIFx6IH14bXMgKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBJbnZhbGlkIFRlbXBsYXRlTnVtYmVyXG4iOwogICAgZXhpdCAxOwp9Cm15ICRUZW1wbGF0ZUlEID0gaW50ICRPcHRze259OwoKIyBjaGVjayBhY3Rpb24gbW9kZQppZiAoICEkT3B0c3thfSApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IE5lZWQgLWEgaW1wb3J0fGV4cG9ydFxuIjsKICAgIGV4aXQgMTsKfQppZiAoIGxjICRPcHRze2F9IG5lICdpbXBvcnQnICYmIGxjICRPcHRze2F9IG5lICdleHBvcnQnICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogSW52YWxpZCBhY3Rpb25cbiI7CiAgICBleGl0IDE7Cn0KCiMgY3JlYXRlIGNvbW1vbiBvYmplY3RzCm15ICVDb21tb25PYmplY3Q7CiRDb21tb25PYmplY3R7Q29uZmlnT2JqZWN0fSA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKJENvbW1vbk9iamVjdHtMb2dPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgTG9nUHJlZml4ID0+ICdPVFJTLUltcG9ydEV4cG9ydCcsCiAgICAlQ29tbW9uT2JqZWN0LAopOwokQ29tbW9uT2JqZWN0e0VuY29kZU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TWFpbk9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7REJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoJUNvbW1vbk9iamVjdCk7CgojIGdldCB0ZW1wbGF0ZSBkYXRhCm15ICRUZW1wbGF0ZURhdGEgPSAkQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCmlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IFRlbXBsYXRlICRPcHRze259IG5vdCBmb3VuZCFcbiI7CiAgICBwcmludCBTVERFUlIgIkV4cG9ydCBhYm9ydGVkLlxuIjsKICAgIGV4aXQgMTsKfQoKIyB0aW1lIHRvIHN0YXJ0CmlmICggbGMgJE9wdHN7YX0gZXEgJ2ltcG9ydCcgKSB7CgogICAgbXkgJFNvdXJjZUNvbnRlbnQgPSBcZG8geycnfTsKICAgIGlmICggJE9wdHN7aX0gKSB7CgogICAgICAgIHByaW50IFNURE9VVCAiUmVhZCBGaWxlICRPcHRze2l9LlxuIjsKCiAgICAgICAgIyByZWFkIHNvdXJjZSBmaWxlCiAgICAgICAgJFNvdXJjZUNvbnRlbnQgPSAkQ29tbW9uT2JqZWN0e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJE9wdHN7aX0sCiAgICAgICAgICAgIFJlc3VsdCAgID0+ICdTQ0FMQVInLAogICAgICAgICAgICBNb2RlICAgICA9PiAnYmlubW9kZScsCiAgICAgICAgKTsKCiAgICAgICAgZGllICJDYW4ndCByZWFkIGZpbGUgJE9wdHN7aX0uXG5JbXBvcnQgYWJvcnRlZC5cbiIgaWYgISRTb3VyY2VDb250ZW50OwogICAgfQoKICAgIHByaW50IFNURE9VVCAiSW1wb3J0IGluIHByb2Nlc3MuLi5cbiI7CgogICAgIyBpbXBvcnQgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRDb21tb25PYmplY3R7SW1wb3J0RXhwb3J0T2JqZWN0fS0+SW1wb3J0KAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU291cmNlQ29udGVudCwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKICAgIGRpZSAiXG5FcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuXG4iIGlmICFkZWZpbmVkICRSZXN1bHQ7CgogICAgcHJpbnQgU1RET1VUICJcbiI7CiAgICBwcmludCBTVERPVVQgIlN1Y2Nlc3M6ICRSZXN1bHQtPntTdWNjZXNzfVxuIjsKICAgIHByaW50IFNURE9VVCAiRmFpbGVkIDogJFJlc3VsdC0+e0ZhaWxlZH1cbiI7CiAgICBwcmludCBTVERPVVQgIlxuIjsKICAgIHByaW50IFNURE9VVCAiSW1wb3J0IGNvbXBsZXRlLlxuIjsKfQplbHNpZiAoIGxjICRPcHRze2F9IGVxICdleHBvcnQnICkgewoKICAgIHByaW50IFNURE9VVCAiRXhwb3J0IGluIHByb2Nlc3MuLi5cbiI7CgogICAgIyBleHBvcnQgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRDb21tb25PYmplY3R7SW1wb3J0RXhwb3J0T2JqZWN0fS0+RXhwb3J0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBkaWUgIlxuRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLlxuIiBpZiAhZGVmaW5lZCAkUmVzdWx0OwoKICAgIHByaW50IFNURE9VVCAiXG4iOwogICAgcHJpbnQgU1RET1VUICJTdWNjZXNzOiAkUmVzdWx0LT57U3VjY2Vzc31cbiI7CiAgICBwcmludCBTVERPVVQgIkZhaWxlZCA6ICRSZXN1bHQtPntGYWlsZWR9XG4iOwogICAgcHJpbnQgU1RET1VUICJcbiI7CgogICAgaWYgKCAkT3B0c3tvfSApIHsKCiAgICAgICAgbXkgJEZpbGVDb250ZW50ID0gam9pbiAiXG4iLCBAeyAkUmVzdWx0LT57RGVzdGluYXRpb25Db250ZW50fSB9OwoKICAgICAgICAjIHNhdmUgZGVzdGluYXRpb24gY29udGVudCB0byBmaWxlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29tbW9uT2JqZWN0e01haW5PYmplY3R9LT5GaWxlV3JpdGUoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRPcHRze299LAogICAgICAgICAgICBDb250ZW50ICA9PiBcJEZpbGVDb250ZW50LAogICAgICAgICk7CgogICAgICAgIGRpZSAiQ2FuJ3Qgd3JpdGUgZmlsZSAkT3B0c3tvfS5cbkV4cG9ydCBhYm9ydGVkLlxuIiBpZiAhJFN1Y2Nlc3M7CgogICAgICAgIHByaW50IFNURE9VVCAiRmlsZSAkT3B0c3tvfSBzYXZlZC5cbiI7CiAgICB9CgogICAgcHJpbnQgU1RET1VUICJFeHBvcnQgY29tcGxldGUuXG4iOwp9CgpleGl0IDA7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251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LZP2rUDD3ZS6XUKFHKcZM3zOMAwanS5cRlX0LgEAAABMtZTE55z0LgEAAAAcTW993P+BdAkAAADgaIa7cb950iUAAAAA4qRLAAAAwJvV7SHqLljrtRcday3b/jnD9qXR6U5UxpnZ1RsAAAB4s7rxzfBP3HKXetph7Zjckrfhdku9M7npYmVUZZGRGAAAAMBB9bQC1VPJKVgZBwAAAECcdAkAAACAuLfclwUAAADAqeldAgAAACBOugQAAABAnHQJAAAAgDjpEgAAAABx0iUAAAAA4qRLAAAAAMRJlwAAAACIky4BAAAAECddAgAAACBOugQAAABAnHQJAAAAgLh3ly4AAAAAYAGapmkPUkq9j4VL0x9SnrE88rL0LgEAAAAcllLqJTvdj4VLw+cUnpmbsTzysvQuAQAAABzZvtXo6lCD0uhd1QZJo6RLAAAAAIe10c+U3GfKqrfuY7sNSoUZuyOrYmUcAAAAwFSjTUnD4+7HwhPmzlinSkMvAAAAABZB7xIAAAAAcdIlAAAAAOKkSwAAAADESZcAAAAAiJMuAQAAABAnXQIAAAAgTroEAAAAQNw/LkNDE7BQzoUAAAAASUVORK5CYII=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBJbXBvcnRFeHBvcnQueG1sLHYgMS4zIDIwMDgvMDEvMjQgMTY6MzM6NTYgbWggRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkltcG9ydEV4cG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkltcG9ydEV4cG9ydCBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluSW1wb3J0RXhwb3J0IGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5JbXBvcnQvRXhwb3J0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkltcG9ydC9FeHBvcnQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrNDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NzEwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uIyMjQ1NWIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Rm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZvcm1hdC1CYWNrZW5kIE1vZHVsIFJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Rm9ybWF0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5DU1Y8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JbXBvcnRFeHBvcnQucG0gLSB0aGUgYnVsZ2FyaWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyAtLQojICRJZDogYmdfSW1wb3J0RXhwb3J0LnBtLHYgMS44IDIwMDkvMDUvMTggMDk6NDI6NTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6YmdfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJyc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJyc7CiAgICAkTGFuZy0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ICAgID0gJyc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJyc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwZXJhdG9yJ30gICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgY2F0YWxhbiB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IFNpc3RlbWVzIE9USUMgKGlic2FsdXQpIC0gQW50b25pbyBMaW5kZQojIC0tCiMgJElkOiBjdF9JbXBvcnRFeHBvcnQucG0sdiAxLjMgMjAwOS8wNS8xOCAwOTo0Mjo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0YXIvRXhwb3J0YXInOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdHZXN0afIgZGUgSW1wb3J0YXIvRXhwb3J0YXInOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICdBZmVnaXIgcGxhbnRpbGxhIGRlIG1hcGF0Z2UnOwogICAgJExhbmctPnsnU3RhcnQgSW1wb3J0J30gICAgICAgICAgICAgICA9ICdDb21lbudhciBpbXBvcnRhY2nzJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnQ29tZW7nYXIgZXhwb3J0YWNp8yc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1Bhcyc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzIGNvbXVuYSc7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzIGRcJ29iamVjdGUnOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgaW5mb3JtYWNp8yBkZSBmb3JtYXQnOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICdFZGl0YXIgaW5mb3JtYWNp8yBkZSBtYXBhdGdlJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGFyIGluZm9ybWFjafMgZGUgcmVjZXJjYSc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ0ltcG9ydGFyIGluZm9ybWFjafMnOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDb2x1bW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhY2nzIHBlciByZWNlcmNhJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnRml0eGVyIGZvbnQnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGVyYXRvcid9ICAgICAgICAgICA9ICdTZXBhcmFkb3IgZGUgY29sdW1uYSc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYnVsYWRvciAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ1B1bnQgaSBjb21hICg7KSc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJ0RvcyBwdW50cyAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICdQdW50ICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0Nvbmp1bnQgZGUgY2Fy4GN0ZXJzJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JbXBvcnRFeHBvcnQucG0gLSB0aGUgY3plY2ggdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBjel9JbXBvcnRFeHBvcnQucG0sdiAxLjcgMjAwOS8wNS8xOCAwOTo0Mjo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBlcmF0b3InfSAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgZ2VybWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfSW1wb3J0RXhwb3J0LnBtLHYgMS4xOSAyMDA5LzA3LzIxIDAwOjU5OjQyIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTkgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0L0V4cG9ydCc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0ltcG9ydC9FeHBvcnQgVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ01hcHBpbmctVGVtcGxhdGUgaGluenVm/Gdlbic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0ltcG9ydCBzdGFydGVuJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnRXhwb3J0IHN0YXJ0ZW4nOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdTY2hyaXR0JzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnQWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSAgICA9ICdPYmpla3QtSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnRm9ybWF0LUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ01hcHBpbmctSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnU3VjaC1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbXBvcnQgSW5mb3JtYXRpb25lbic7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ1NwYWx0ZSc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0V4cG9ydCBwZXIgU3VjaGUgZWluc2NocuRua2VuJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnUXVlbGwtRGF0ZWknOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGVyYXRvcid9ICAgICAgICAgICA9ICdTcGFsdGVudHJlbm5lcic7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYnVsYXRvciAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ1NlbWljb2xvbiAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEb3BwZWxwdW5rdCAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICdQdW5rdCAoLiknOwogICAgJExhbmctPnsnQ2hhcnNldCd9ICAgICAgICAgICAgICAgICAgICA9ICdaZWljaGVuc2F0eic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JbXBvcnRFeHBvcnQucG0gLSB0aGUgc3BhbmlzaCB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IEFxdWlsZXMgQ29oZW4KIyAtLQojICRJZDogZXNfSW1wb3J0RXhwb3J0LnBtLHYgMS41IDIwMDkvMDUvMTggMDk6NDI6NTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydGFyL0V4cG9ydGFyJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnR2VzdGnzbiBkZSBJbXBvcnRhY2nzbi9FeHBvcnRhY2nzbic7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ0HxYWRpciBtYXBlYWRvIGRlIHBsYW50aWxsYSc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0luaWNpYXIgSW1wb3J0YWNp824nOwogICAgJExhbmctPnsnU3RhcnQgRXhwb3J0J30gICAgICAgICAgICAgICA9ICdJbmljaWFyIEV4cG9ydGFjafNuJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFzbyc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzbiBjb236bic7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzbiBkZSBvYmpldG8nOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgZm9ybWF0byBkZSBpbmZvcm1hY2nzbic7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ0VkaXRhciBtYXBlYWRvIGRlIGluZm9ybWFjafNuJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGFyIGluZm9ybWFjafNuIGRlIGJ1c3F1ZWRhJzsKICAgICRMYW5nLT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ICAgICAgICAgPSAnSW1wb3J0YXIgaW5mb3JtYWNp824nOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDb2x1bW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhY2nzbiBwb3IgY29uc3VsdGEnOwogICAgJExhbmctPnsnU291cmNlIEZpbGUnfSAgICAgICAgICAgICAgICA9ICdBcmNoaXZvIG9yaWdlbic7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwZXJhdG9yJ30gICAgICAgICAgID0gJ1NlcGFyYWRvciBkZSBDb2x1bW5hJzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnVGFidWxhZG9yIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnUHVudG8geSBDb21hICg7KSc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJ0RvcyBwdW50b3MgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUHVudG8gKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgcGVyc2lhbiAoZmFyc2kpIHRyYW5zbGF0aW9uIG9mIGZhX0ltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBBZnNoYXIgTW9oZWJiaSA8YWZzaGFyLm1vaGViYmkgYXQgZ21haWwuY29tPgojIC0tCiMgJElkOiBmYV9JbXBvcnRFeHBvcnQucG0sdiAxLjEgMjAwOS8wNy8yMCAxMDo0NjowOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAn2YjYsdmI2K8v2LXYr9mI2LEnOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICfZhdiv24zYsduM2Kog2YjYsdmI2K8v2LXYr9mI2LEnOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICfYp9i22KfZgdmHINqp2LHYr9mGINuM2qkg2YLYp9mE2Kgg2Ybar9in2LTYqic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ9i02LHZiNi5INi52YXZhNuM2KfYqiDZiNix2YjYryc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ9i02LHZiNi5INi52YXZhNuM2KfYqiDYtdiv2YjYsSc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ9qv2KfZhSc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDYudmF2YjZhduMJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAn2YjbjNix2KfbjNi0INin2LfZhNin2LnYp9iqINii2KjYrNqp2KrbjCc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDZgtin2YTYqOKAjNio2YbYr9uMJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAn2YjbjNix2KfbjNi0INin2LfZhNin2LnYp9iqINmG2q/Yp9i02KonOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICfZiNuM2LHYp9uM2LQg2KfYt9mE2KfYudin2Kog2KzYs9iq2KzZiCc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ9mI2LHZiNivINin2LfZhNin2LnYp9iqJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAn2LPYqtmI2YYnOwogICAgJExhbmctPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfZhdit2K/ZiNiv2LPYp9iy24wg2LnZhdmE24zYp9iqINi12K/ZiNixINio2Ycg2KfYstin24wg2KzYs9iq2KzZiCc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ9mB2KfbjNmEINmF2YbYqNi5JzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBlcmF0b3InfSAgICAgICAgICAgPSAn2KzYr9in2qnZhtmG2K/ZhyDYs9iq2YjZhuKAjNmH2KcnOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICfYrNiv2YjZhCDYs9in2LIgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICfYs9mF24wg2qnYp9mE2YYgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAn2K/ZiNmG2YLYt9mHICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ9mG2YLYt9mHICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ9qp2K/YqNmG2K/bjCDYp9i32YTYp9i52KfYqic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgaXRhbGlhbiB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGl0X0ltcG9ydEV4cG9ydC5wbSx2IDEuMSAyMDA5LzA1LzE4IDA5OjQyOjM0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ICAgICAgICAgICAgICA9ICdJbXBvcnRhcmUvRXNwb3J0YXJlJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnR2VzdGlvbmUgSW1wb3J0YXppb25lL0VzcG9ydGF6aW9uZSc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ0FnZ2l1bmdpIG1hcHBhdHVyYSBtb2RlbGxvJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pemlhcmUgSW1wb3J0YXppb25lJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pemlhcmUgRXNwb3J0YXppb25lJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFzc28nOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdNb2RpZmljYSBpbmZvcm1hemlvbmkgY29tdW5pJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnTW9kaWZpY2EgaW5mb3JtYXppb25pIG9nZ2V0dG8nOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdNb2RpZmljYSBmb3JtYXRvIGluZm9ybWF6aW9uZSc7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ01vZGlmaWNhIG1hcHBhdHVyYSBpbmZvcm1hemlvbmknOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdNb2RpZmljYSBpbmZvcm1hemlvbmkgZGkgcmljZXJjYSc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ0ltcG9ydGFyZSBpbmZvcm1hemlvbmUnOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDb2xvbm5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdlcmUgZXNwb3J0YXppb25lIHBlciByaWNlcmNhJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnQXJjaGl2aW8gb3JpZ2luZSc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwZXJhdG9yJ30gICAgICAgICAgID0gJ1NlcGFyYXRvcmUgZGkgY29sb25uYSc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYnVsYXRvcmUgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdQdW50byBlIHZpcmdvbGEgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRHVlIHB1bnRpICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ1B1bnRvICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0NoYXJzZXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgRHV0Y2ggdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hpZWwgQmVpamVuIDxtaWNoaWVsICdhdCcgYmVlZnJlZWl0Lm5sPgojIC0tCiMgJElkOiBubF9JbXBvcnRFeHBvcnQucG0sdiAxLjIgMjAwOS8wNy8yMCAxMzo1NTo1MCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0L0V4cG9ydCc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0ltcG9ydC9FeHBvcnQgYmVoZWVyJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnTWFwcGluZ3RlbXBsYXRlIHRvZXZvZWdlbic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0ltcG9ydCBzdGFydGVuJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnRXhwb3J0IHN0YXJ0ZW4nOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdTdGFwJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnQWxnZW1lbmUgaW5mb3JtYXRpZSBiZXdlcmtlbic7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ09iamVjdC1pbmZvcm1hdGllIGJld2Vya2VuJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnRm9ybWF0LWluZm9ybWF0aW9uZW4gYmV3ZXJrZW4nOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICdNYXBwaW5nLWluZm9ybWF0aWUgYmV3ZXJrZW4nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdab2VrLWluZm9ybWF0aWUgYmV3ZXJrZW4nOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbXBvcnQtaW5mb3JtYXRpZSc7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ0tvbG9tJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnQmVwZXJrIGV4cG9ydCB0b3Qgem9la29wZHJhY2h0JzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnQnJvbmJlc3RhbmQnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGVyYXRvcid9ICAgICAgICAgICA9ICdLb2xvbXNjaGVpZGluZ3N0ZWtlbic7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYic7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ1B1bnRrb21tYSAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEdWJiZWxlIHB1bnQgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUHVudCAoLiknOwogICAgJExhbmctPnsnQ2hhcnNldCd9ICAgICAgICAgICAgICAgICAgICA9ICdLYXJha3RlcnNldCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgcG9saXNoIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDggTWFjaWVqIExvc3phamMKIyAtLQojICRJZDogcGxfSW1wb3J0RXhwb3J0LnBtLHYgMS40IDIwMDkvMDUvMTggMDk6NDI6NTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydC9FeHBvcnQnOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdaYXJ6MWR6YW5pZSBJbXBvcnRlbS9FeHBvcnRlbSc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ1JvenBvY3puaWogSW1wb3J0JzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnUm96cG9jem5paiBFeHBvcnQnOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdLb2x1bW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnUGxpayBZcvNkM293eSc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwZXJhdG9yJ30gICAgICAgICAgID0gJ1NlcGFyYXRvciBrb2x1bW55JzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnVGFidWxhdG9yIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnT3JlZG5payAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEd3Vrcm9wZWsgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnS3JvcGthICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0tvZG93YW5pZSc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgcnVzc2lhbiB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IEVnb3IgVHNpbGVua28gPGJnOHMgYXQgc3ltbGluay5ydT4KIyAtLQojICRJZDogcnVfSW1wb3J0RXhwb3J0LnBtLHYgMS4yIDIwMDkvMDUvMTggMDk6NDI6NTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ8js7+7w8i/d6vHv7vDyJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAn0+/w4OLr5e3o5SDI7O/u8PLu7C/d6vHv7vDy7uwnOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICfE7uHg4uvl7ejlIPjg4evu7eAg8e7u8uLl8vHy4uj/JzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnzeD34PL8IOjs7+7w8ic7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ83g9+Dy/CD96vHv7vDyJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAn2ODjJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAn0OXk4Ory6PDu4uDy/CDu4fnz/iDo7fTu8Ozg9uj+JzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAn0OXk4Ory6PDu4uDy/CDo7fTu8Ozg9uj+IO7hIO7h+uXq8uUnOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICfQ5eTg6vLo8O7i4PL8IPTu8Ozg8iDk4O3t+/UnOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICfQ5eTg6vLo8O7i4PL8IOjt9O7w7OD26P4g8e7u8uLl8vHy4uj/JzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAn0OXk4Ory6PDu4uDy/CDv7ujx6u7i8/4g6O307vDs4Pbo/ic7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ8jt9O7w7OD26P8g6Ozv7vDy4Cc7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ9Hy7uvh5fYnOwogICAgJExhbmctPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfO4/Dg7ej36PL8IP3q8e/u8PIg7+7o8eru7Cc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ8jx9e7k7fvpIPTg6esnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGVyYXRvcid9ICAgICAgICAgICA9ICfQ4Ofk5evo8uXr/Cc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ9Lg4fPr//bo/yAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ9Lu9+rgIPEg5+Dv//Lu6SAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICfE4u7l8u736OUgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAn0u736uAgKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnyu7k6PDu4urgJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgaW1wb3J0IGV4cG9ydCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LnBtLHYgMS4yMCAyMDA5LzA1LzE4IDA5OjQyOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjAgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoY29tbW9uKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDEnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CiAgICAgICAgaWYgKCAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gZXEgJ05FVycgKSB7CgogICAgICAgICAgICAjIGdldCBuZWVkZWQgZGF0YQogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09iamVjdCcgKTsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtYXQnICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKQogICAgICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwogICAgICAgIG15ICRWYWxpZE9wdGlvblN0cmcgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0MScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICA9PiAkT2JqZWN0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB9LAogICAgICAgICAgICAgICAgRm9ybWF0TmFtZSAgICAgID0+ICRGb3JtYXRMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IH0sCiAgICAgICAgICAgICAgICBWYWxpZE9wdGlvblN0cmcgPT4gJFZhbGlkT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZVNhdmUxJyApIHsKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KFRlbXBsYXRlSUQgT2JqZWN0IEZvcm1hdCBOYW1lIFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+eyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0MicsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDEnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhY3Rpb24KICAgICAgICBteSAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIGtleXMgJVN1Ym1pdCApIHsKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgIGlmICggJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9IGVxICdORVcnICkgewogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU3VjY2VzcyA9ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiQ2FuJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEiICkKICAgICAgICAgICAgaWYgISRTdWNjZXNzOwoKICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3IG9iamVjdCBsaXN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249VGVtcGxhdGVFZGl0MiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKG9iamVjdCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQyJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAkT2JqZWN0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE9iamVjdEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBvYmplY3QgZGF0YQogICAgICAgIG15ICRPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRPYmplY3RBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRPYmplY3REYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0MlJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCByZXF1aXJlZCBub3RpY2UKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0MlJvd1JlcXVpcmVkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAob2JqZWN0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTInICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDEnLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQyJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYWN0aW9uCiAgICAgICAgbXkgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKCiAgICAgICAgUEFSQU06CiAgICAgICAgZm9yIG15ICRTdWJtaXRLZXkgKCBrZXlzICVTdWJtaXQgKSB7CiAgICAgICAgICAgIG5leHQgUEFSQU0gaWYgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFN1Ym1pdEtleSApOwoKICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7JFN1Ym1pdEtleX07CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIG15ICRPYmplY3RBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHskT2JqZWN0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVsb2FkIGZvcm0gaWYgdmFsdWUgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIG9iamVjdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj0kU3ViYWN0aW9uJlRlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChmb3JtYXQpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0MycgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkT2JqZWN0TGlzdDsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRGb3JtYXRMaXN0OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRGb3JtYXRBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgICAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgZm9yIG15ICRJdGVtICggQHskRm9ybWF0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRm9ybWF0RGF0YS0+eyAkSXRlbS0+e0tleX0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDNSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIElucHV0U3RyZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcmVxdWlyZWQgbm90aWNlCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntJbnB1dH0tPntSZXF1aXJlZH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDNSb3dSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUgKGZvcm1hdCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZVNhdmUzJyApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgIG15ICVTdWJtaXQgPSAoCiAgICAgICAgICAgIFN1Ym1pdE5leHQgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBTdWJtaXRCYWNrID0+ICdUZW1wbGF0ZUVkaXQyJywKICAgICAgICAgICAgUmVsb2FkICAgICA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICBsYXN0IFBBUkFNOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkRm9ybWF0QXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JEZvcm1hdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBmb3JtIGlmIHZhbHVlIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRoZSBmb3JtYXQgZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gXCVBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAobWFwcGluZykKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQ0JyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJE9iamVjdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfSwKICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgZm9ybWF0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRm9ybWF0RGF0YUdldCgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdPYmplY3Q6OicgLiAkQ291bnRlciAuICc6OicsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgID0+ICRNYXBwaW5nT2JqZWN0RGF0YS0+eyAkSXRlbS0+e0tleX0gfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0Um93T2JqZWN0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkQ291bnRlciwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ0Zvcm1hdDo6JyAuICRDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJE1hcHBpbmdGb3JtYXREYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRSb3dGb3JtYXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBzYXZlIChtYXBwaW5nKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTQnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDMnLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgTWFwcGluZ0FkZCA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gICAgPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgbXkgJFN1Ym1pdEJ1dHRvbiA9ICcnOwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIGtleXMgJVN1Ym1pdCApIHsKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uICAgID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgJFN1Ym1pdEJ1dHRvbiA9ICRTdWJtaXRLZXk7CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgTUFQUElOR0lEOgogICAgICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZSB2YWx1ZXMKICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZVZhbHVlczsKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ09iamVjdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IG9iamVjdCBmb3JtIGRhdGEKICAgICAgICAgICAgICAgICRPYmplY3RBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ09iamVjdDo6JyAuICRDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gXCVPYmplY3RBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlIHZhbHVlcwogICAgICAgICAgICBteSAlRm9ybWF0QXR0cmlidXRlVmFsdWVzOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZm9ybWF0IGZvcm0gZGF0YQogICAgICAgICAgICAgICAgJEZvcm1hdEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnRm9ybWF0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbWFwcGluZyBmb3JtYXQgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nRm9ybWF0RGF0YSA9PiBcJUZvcm1hdEF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBNQVBQSU5HSUQ6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGRlbGV0ZSB0aGlzIG1hcHBpbmcgcm93CiAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiTWFwcGluZ0RlbGV0ZTo6JE1hcHBpbmdJRCIgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW92ZSBtYXBwaW5nIGRhdGEgcm93IHVwCiAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiTWFwcGluZ1VwOjokTWFwcGluZ0lEIiApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nVXAoCiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR0lEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1vdmUgbWFwcGluZyBkYXRhIHJvdyBkb3duCiAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiTWFwcGluZ0Rvd246OiRNYXBwaW5nSUQiICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdEb3duKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgYSBuZXcgbWFwcGluZyByb3cKICAgICAgICBpZiAoICRTdWJtaXRCdXR0b24gZXEgJ01hcHBpbmdBZGQnICkgewogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdBZGQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPSRTdWJhY3Rpb24mVGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKHNlYXJjaCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQ1JyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlYXJjaCBkYXRhCiAgICAgICAgbXkgJFNlYXJjaERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSByZXNjcmljdCBleHBvcnQgc3RyaW5nCiAgICAgICAgbXkgJFJlc3RyaWN0RXhwb3J0U3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICBJdGVtID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdSZXN0cmljdEV4cG9ydCcsCiAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnQ2hlY2tib3gnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmFsdWUgPT4gc2NhbGFyIGtleXMgJXskU2VhcmNoRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBSZXN0cmljdEV4cG9ydFN0cmcgPT4gJFJlc3RyaWN0RXhwb3J0U3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzZWFyY2ggYXR0cmlidXRlcwogICAgICAgIG15ICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRTZWFyY2hBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZWFyY2hEYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUgKHNlYXJjaCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZVNhdmU1JyApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgIG15ICVTdWJtaXQgPSAoCiAgICAgICAgICAgIFN1Ym1pdE5leHQgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgU3VibWl0QmFjayA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDUnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhY3Rpb24KICAgICAgICBteSAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIGtleXMgJVN1Ym1pdCApIHsKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggcmVzdHJpY3Rpb25zCiAgICAgICAgaWYgKCAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVzdHJpY3RFeHBvcnQnICkgKSB7CgogICAgICAgICAgICAjIGRlbGV0ZSBhbGwgc2VhcmNoIGRhdGEKICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlYXJjaCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJFNlYXJjaEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmb3JtCiAgICAgICAgbXkgJUF0dHJpYnV0ZVZhbHVlczsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRTZWFyY2hBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgZm9ybSBpZiB2YWx1ZSBpcyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICRJdGVtLT57Rm9ybX0tPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0aGUgc2VhcmNoIGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPSRTdWJhY3Rpb24mVGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGRlbGV0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRGVsZXRlJyApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZGVsZXRlIHRlbXBsYXRlIGZyb20gZGF0YWJhc2UKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaW1wb3J0IGluZm9ybWF0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSW1wb3J0SW5mb3JtYXRpb24nICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ltcG9ydEluZm9ybWF0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaW1wb3J0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSW1wb3J0JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZXQgc291cmNlIGZpbGUKICAgICAgICBteSAlU291cmNlRmlsZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtICA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAkU291cmNlRmlsZXtDb250ZW50fSB8fD0gJyc7CgogICAgICAgICMgaW1wb3J0IGRhdGEKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5JbXBvcnQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFwkU291cmNlRmlsZXtDb250ZW50fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLicsCiAgICAgICAgKSBpZiAhJFJlc3VsdDsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249T3ZlcnZpZXcmVGVtcGxhdGVJRD0kVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBleHBvcnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdFeHBvcnQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwoKICAgICAgICAjIGV4cG9ydCBkYXRhCiAgICAgICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+RXhwb3J0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLicsCiAgICAgICAgKSBpZiAhJFJlc3VsdDsKCiAgICAgICAgbXkgJEZpbGVDb250ZW50ID0gam9pbiAiXG4iLCBAeyAkUmVzdWx0LT57RGVzdGluYXRpb25Db250ZW50fSB9OwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdFeHBvcnQuY3N2JywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvY3N2JywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEZpbGVDb250ZW50LAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkT2JqZWN0TGlzdDsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRGb3JtYXRMaXN0OwoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICBteSAkRW1wdHlEYXRhYmFzZSA9IDE7CgogICAgICAgIENMQVNTOgogICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7ICRPYmplY3RMaXN0LT57JGF9IGNtcCAkT2JqZWN0TGlzdC0+eyRifSB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdCA9PiAkT2JqZWN0LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ0xBU1MgaWYgISRUZW1wbGF0ZUxpc3Q7CiAgICAgICAgICAgIG5leHQgQ0xBU1MgaWYgcmVmICRUZW1wbGF0ZUxpc3QgbmUgJ0FSUkFZJzsKICAgICAgICAgICAgbmV4dCBDTEFTUyBpZiAhQHskVGVtcGxhdGVMaXN0fTsKCiAgICAgICAgICAgICRFbXB0eURhdGFiYXNlID0gMDsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57JE9iamVjdH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIEB7JFRlbXBsYXRlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgb3V0cHV0IG9iamVjdAogICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgICA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkICAgICAgPT4gJFZhbGlkTGlzdHsgJFRlbXBsYXRlRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGFuIGVtcHR5IGxpc3QKICAgICAgICBpZiAoJEVtcHR5RGF0YWJhc2UpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICdUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveC5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3gucG0sdiAxLjQgMjAwOS8wNS8xOCAwOTo0Mjo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgY2hlY2tib3ggZWxlbWVudHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3gtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbHVlICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiJFBhcmFte1ByZWZpeH0kUGFyYW17SXRlbX0tPntLZXl9XCIgIjsKCiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFN0cmluZyAuPSAiY2hlY2tlZCAiOwogICAgfQoKICAgICRTdHJpbmcgLj0gIj4gIjsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkRm9ybURhdGEgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgUGFyYW0gPT4gJFBhcmFte1ByZWZpeH0gLiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgKTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDkvMDUvMTggMDk6NDI6NTIgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXREVEwucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dERUTC5wbSx2IDEuMyAyMDA5LzA1LzE4IDA5OjQyOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEwgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIGRpc3BsYXkgRFRMIGNvZGUKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0RFRMLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntEYXRhfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgpOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDkvMDUvMTggMDk6NDI6NTIgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24ucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbi5wbSx2IDEuOCAyMDA5LzA1LzE4IDA5OjQyOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjggJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIHNlbGVjdGlvbiBlbGVtZW50cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24tPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbHVlICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKICAgICRQYXJhbXtWYWx1ZX0gIHx8PSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwoKICAgIGlmICggJFBhcmFte1ZhbHVlfSAmJiAkUGFyYW17VmFsdWV9ID1+IG17ICMjIyMjIH14bXMgKSB7CiAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0ICcjIyMjIycsICRQYXJhbXtWYWx1ZX07CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9IFxAVmFsdWVzOwogICAgfQoKICAgICMgZ2VuZXJhdGUgb3B0aW9uIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57RGF0YX0gfHwge30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgVHJhbnNsYXRpb24gID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UG9zc2libGVOb25lfSwKICAgICAgICBNdWx0aXBsZSAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TXVsdGlwbGV9LAogICAgICAgIFNpemUgICAgICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntTaXplfSwKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgQEZvcm1EYXRhcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIG15ICRGb3JtRGF0YSA9IGpvaW4gJyMjIyMjJywgQEZvcm1EYXRhczsKCiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICRGb3JtRGF0YTsKICAgIHJldHVybiAkRm9ybURhdGEgaWYgISRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+e0ludmFsaWR9ID0gMTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS44ICQgJERhdGU6IDIwMDkvMDUvMTggMDk6NDI6NTIgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtLHYgMS43IDIwMDkvMDUvMTggMDk6NDI6NTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFRleHQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRUZXh0IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIGZvciB0ZXh0IGVsZW1lbnRzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFRleHQtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbHVlICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICBteSAkU2l6ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9IHx8IDQwOwogICAgbXkgJFN0cmluZyA9ICI8aW5wdXQgdHlwZT1cIlRleHRcIiBuYW1lPVwiJFBhcmFte1ByZWZpeH0kUGFyYW17SXRlbX0tPntLZXl9XCIgc2l6ZT1cIiRTaXplXCIgIjsKCiAgICBpZiAoJFZhbHVlKSB7CgogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRWYWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFN0cmluZyAuPSAidmFsdWU9XCIkVmFsdWVcIiAiOwogICAgfQoKICAgICMgYWRkIG1heGltdW0gbGVuZ3RoCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH0gKSB7CiAgICAgICAgJFN0cmluZyAuPSAibWF4bGVuZ3RoPVwiJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TWF4TGVuZ3RofVwiICI7CiAgICB9CgogICAgJFN0cmluZyAuPSAiPiAiOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgICMgcmVnZXggY2hlY2sKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVnZXh9ICYmICRGb3JtRGF0YSAhfiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdleH0gKSB7CgogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57SW52YWxpZH0gPSAxOwogICAgICAgIHJldHVybiAkRm9ybURhdGE7CiAgICB9CgogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAkRm9ybURhdGE7CiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICEkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH07CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA5LzA1LzE4IDA5OjQyOjUyICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0IGZvciBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExheW91dEltcG9ydEV4cG9ydC5wbSx2IDEuNCAyMDA5LzA1LzE4IDA5OjQyOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRJbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWl0ZW0gSW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKCkKCnJldHVybnMgYSBpbnB1dCBmaWVsZCBodG1sIHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gJ1ZhbHVlJywgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgbG9va3VwIGl0ZW0gdmFsdWUKICAgIG15ICRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KCkKCnJldHVybnMgdGhlIHZhbHVlcyBmcm9tIHRoZSBodG1sIGZvcm0gYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGEgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRFeHBvcnRGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCglUGFyYW0pOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCj1pdGVtIF9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgpCgp0byBsb2FkIGEgaW1wb3J0L2V4cG9ydCBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCiAgICAkSGFzaFJlZiA9ICRMYXlvdXRPYmplY3QtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgKTsKCj1jdXQKCnN1YiBfSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIG9iamVjdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57SW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmR9LT57ICRQYXJhbXtUeXBlfSB9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntJbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZH0tPnsgJFBhcmFte1R5cGV9IH07CgogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dCRQYXJhbXtUeXBlfSI7CgogICAgIyBsb2FkIHRoZSBiYWNrZW5kIG1vZHVsZQogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgJVBhcmFtLAogICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICk7CgogICAgaWYgKCAhJEJhY2tlbmRPYmplY3QgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSB0aGUgb2JqZWN0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfSA9ICRCYWNrZW5kT2JqZWN0OwoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsK
IyAtLQojIEFkbWluSW1wb3J0RXhwb3J0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LmR0bCx2IDEuMTYgMjAwOS8wNS8xOCAwOTo0Mjo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZUVkaXQxIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iTkVXIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgbWFwcGluZyB0ZW1wbGF0ZSJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwMCI+JFRleHR7Ik9iamVjdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9iamVjdE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGb3JtYXQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJGb3JtYXRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiJFFEYXRheyJPYmplY3ROYW1lIn0ifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik51bWJlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGb3JtYXQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJ2YWxpZCJ9LyRUZXh0eyJpbnZhbGlkIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iOTAiPiRUZXh0eyJEZWxldGUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI5MCI+JFRleHR7IlN0YXJ0IEltcG9ydCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjkwIj4kVGV4dHsiU3RhcnQgRXhwb3J0In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVRlbXBsYXRlRWRpdDEmVGVtcGxhdGVJRD0kUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiTnVtYmVyIn0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiRm9ybWF0TmFtZSJ9In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUZXh0eyIkUURhdGF7IlZhbGlkIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVRlbXBsYXRlRGVsZXRlJlRlbXBsYXRlSUQ9JFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAkVGV4dHsieCJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUltcG9ydEluZm9ybWF0aW9uJlRlbXBsYXRlSUQ9JFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAkVGV4dHsieCJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cG9ydCZUZW1wbGF0ZUlEPSRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICAgICAgICAgICAgJFRleHR7IngifQogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MSAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmUxIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlN0ZXAifSAxICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBjb21tb24gaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9iamVjdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJPYmplY3ROYW1lIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPYmplY3QiIHZhbHVlPSIkUURhdGF7Ik9iamVjdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZvcm1hdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJGb3JtYXROYW1lIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtYXQiIHZhbHVlPSIkUURhdGF7IkZvcm1hdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IiRUZXh0eyJOZXh0Li4uIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDEgLS0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDIgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlMiI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTdGVwIn0gMiAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgb2JqZWN0IGluZm9ybWF0aW9uIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ik5hbWUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9iamVjdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJPYmplY3ROYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MlJvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifToKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MlJvd1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MlJvd1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IklucHV0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDJSb3cgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IiRUZXh0eyIuLi5CYWNrIn0iPiZuYnNwOwogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdE5leHQiIHZhbHVlPSIkVGV4dHsiTmV4dC4uLiJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyIC0tPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzIC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTMiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSIkUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU3RlcCJ9IDMgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbiJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGb3JtYXQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRm9ybWF0TmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNSb3dSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IlJlcXVpcmVkIn0iPio8L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNSb3dSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnB1dFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzUm93IC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdEJhY2siIHZhbHVlPSIkVGV4dHsiLi4uQmFjayJ9Ij4mbmJzcDsKICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iJFRleHR7Ik5leHQuLi4ifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MyAtLT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NCAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmU0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlN0ZXAifSA0ICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ik5hbWUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJPYmplY3ROYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiRm9ybWF0TmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjMiPjxociB3aWR0aD0iMTAwJSI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Um93T2JqZWN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IklucHV0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3dPYmplY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3dGb3JtYXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvd0Zvcm1hdCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nVXA6OiRRRGF0YXsiTWFwcGluZ0lEIn0iIHZhbHVlPSIkVGV4dHsiVXAifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iTWFwcGluZ0Rvd246OiRRRGF0YXsiTWFwcGluZ0lEIn0iIHZhbHVlPSIkVGV4dHsiRG93biJ9Ij4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nRGVsZXRlOjokUURhdGF7Ik1hcHBpbmdJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSIzIj48aHIgd2lkdGg9IjEwMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Um93IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iTWFwcGluZ0FkZCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXRCYWNrIiB2YWx1ZT0iJFRleHR7Ii4uLkJhY2sifSI+Jm5ic3A7CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IiRUZXh0eyJOZXh0Li4uIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDQgLS0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDUgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlNSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTdGVwIn0gNSAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgc2VhcmNoIGluZm9ybWF0aW9uIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ik5hbWUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzdHJpY3RFeHBvcnRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+Jm5ic3A7PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDVSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06CiAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NVJvdyAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXRCYWNrIiB2YWx1ZT0iJFRleHR7Ii4uLkJhY2sifSI+Jm5ic3A7CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IiRUZXh0eyJGaW5pc2gifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NSAtLT4KPCEtLSBkdGw6YmxvY2s6SW1wb3J0SW5mb3JtYXRpb24gLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkltcG9ydCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJJbXBvcnQgaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiU291cmNlIEZpbGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJTb3VyY2VGaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdGFydCBJbXBvcnQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6SW1wb3J0SW5mb3JtYXRpb24gLS0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0LnBtIC0gYWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBtLHYgMS4zMiAyMDA5LzA3LzIwIDIyOjU1OjIzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMzIgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQgLSBpbXBvcnQsIGV4cG9ydCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFRlbXBsYXRlTGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIHRlbXBsYXRlcyBhcyBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgICAgIE9iamVjdCA9PiAnVGlja2V0JywgICMgKG9wdGlvbmFsKQogICAgICAgIEZvcm1hdCA9PiAnQ1NWJyAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgMT0xICc7CiAgICBteSBAQklORDsKCiAgICBpZiAoICRQYXJhbXtPYmplY3R9ICkgewogICAgICAgICRTUUwgLj0gJ0FORCBpbWV4cG9ydF9vYmplY3QgPSA/ICc7CiAgICAgICAgcHVzaCBAQklORCwgXCRQYXJhbXtPYmplY3R9OwogICAgfQogICAgaWYgKCAkUGFyYW17Rm9ybWF0fSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgaW1leHBvcnRfZm9ybWF0ID0gPyAnOwogICAgICAgIHB1c2ggQEJJTkQsIFwkUGFyYW17Rm9ybWF0fTsKICAgIH0KCiAgICAjIGFkZCBvcmRlciBvcHRpb24KICAgICRTUUwgLj0gJ09SREVSIEJZIGlkJzsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBUZW1wbGF0ZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFRlbXBsYXRlTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBUZW1wbGF0ZUxpc3Q7Cn0KCj1pdGVtIFRlbXBsYXRlR2V0KCkKCmdldCBhIGltcG9ydCBleHBvcnQgdGVtcGxhdGUKClJldHVybgogICAgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfQogICAgJFRlbXBsYXRlRGF0YXtOdW1iZXJ9CiAgICAkVGVtcGxhdGVEYXRhe09iamVjdH0KICAgICRUZW1wbGF0ZURhdGF7Rm9ybWF0fQogICAgJFRlbXBsYXRlRGF0YXtOYW1lfQogICAgJFRlbXBsYXRlRGF0YXtWYWxpZElEfQogICAgJFRlbXBsYXRlRGF0YXtDb21tZW50fQogICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVUaW1lfQogICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVCeX0KICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlVGltZX0KICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlQnl9CgogICAgbXkgJFRlbXBsYXRlRGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVRlbXBsYXRlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfSA9ICRSb3dbMF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtPYmplY3R9ICAgICA9ICRSb3dbMV07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtGb3JtYXR9ICAgICA9ICRSb3dbMl07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbM107CiAgICAgICAgJFRlbXBsYXRlRGF0YXtWYWxpZElEfSAgICA9ICRSb3dbNF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDb21tZW50fSAgICA9ICRSb3dbNV0gfHwgJyc7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNl07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVCeX0gICA9ICRSb3dbN107CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbOF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbOV07CgogICAgICAgICRUZW1wbGF0ZURhdGF7TnVtYmVyfSA9IHNwcmludGYgIiUwNmQiLCAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9OwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH0gPSBcJVRlbXBsYXRlRGF0YTsKCiAgICByZXR1cm4gXCVUZW1wbGF0ZURhdGE7Cn0KCj1pdGVtIFRlbXBsYXRlQWRkKCkKCmFkZCBhIG5ldyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlCgogICAgbXkgJFRlbXBsYXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdUaWNrZXQnLAogICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgTmFtZSAgICA9PiAnVGVtcGxhdGUgTmFtZScsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEZvcm1hdCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGltZXhwb3J0X29iamVjdCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T2JqZWN0fSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROb0FkZCA9IDE7CiAgICB9CgogICAgIyBhYm9ydCBpbnNlcnQgb2YgbmV3IHRlbXBsYXRlLCBpZiB0ZW1wbGF0ZSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IHRlbXBsYXRlISBUZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIG9iamVjdC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyB0ZW1wbGF0ZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF90ZW1wbGF0ZSAnCiAgICAgICAgICAgIC4gJyhpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgIC4gJyg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtPYmplY3R9LCBcJFBhcmFte0Zvcm1hdH0sIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q29tbWVudH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgdGVtcGxhdGUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte09iamVjdH0sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRUZW1wbGF0ZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRUZW1wbGF0ZUlEOwp9Cgo9aXRlbSBUZW1wbGF0ZVVwZGF0ZSgpCgp1cGRhdGUgYSBleGlzdGluZyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBOYW1lICAgICAgID0+ICdUZW1wbGF0ZSBOYW1lJywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICA9PiAnQ29tbWVudCcsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBvYmplY3Qgb2YgdGhpcyB0ZW1wbGF0ZSBpZAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpbWV4cG9ydF9vYmplY3QgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE9iamVjdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE9iamVjdCA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCAhJE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHVwZGF0ZSB0ZW1wbGF0ZSEgSSBjYW4ndCBmaW5kIHRoZSB0ZW1wbGF0ZS4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZmluZCBleGl0aW5nIHRlbXBsYXRlIHdpdGggc2FtZSBuYW1lCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaW1leHBvcnRfb2JqZWN0ID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRPYmplY3QsIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRVcGRhdGUgPSAxOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkVXBkYXRlID0gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFVwZGF0ZSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IHVwZGF0ZSB0ZW1wbGF0ZSEgVGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBvYmplY3QuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyB1cGRhdGUgdGVtcGxhdGUKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgaW1leHBvcnRfdGVtcGxhdGUgU0VUIG5hbWUgPSA/LCcKICAgICAgICAgICAgLiAndmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sICcKICAgICAgICAgICAgLiAnY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBdLAogICAgKTsKfQoKPWl0ZW0gVGVtcGxhdGVEZWxldGUoKQoKZGVsZXRlIGV4aXN0aW5nIGltcG9ydC9leHBvcnQgdGVtcGxhdGVzCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBzZWFyY2ggZGF0YQogICAgJFNlbGYtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIG1hcHBpbmcgZGF0YQogICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHsgJFBhcmFte1RlbXBsYXRlSUR9IH0gKSB7CiAgICAgICAgJFNlbGYtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgZGF0YQogICAgJFNlbGYtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEKICAgICRTZWxmLT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgcmVzZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1pdGVtIE9iamVjdExpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBhdmFpbGFibGUgb2JqZWN0cyBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRPYmplY3RMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKPWN1dAoKc3ViIE9iamVjdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcKICAgIG15ICRNb2R1bGVMaXN0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKICAgIHJldHVybiBpZiAhJE1vZHVsZUxpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRNb2R1bGVMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNyZWF0ZSB0aGUgb2JqZWN0IGxpc3QKICAgIG15ICRPYmplY3RMaXN0ID0ge307CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRNb2R1bGVMaXN0fSApIHsKICAgICAgICAkT2JqZWN0TGlzdC0+eyRNb2R1bGV9ID0gJE1vZHVsZUxpc3QtPnskTW9kdWxlfS0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiAkT2JqZWN0TGlzdDsKfQoKPWl0ZW0gT2JqZWN0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBub3QgY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBvYmplY3QKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgJVBhcmFtLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBPYmplY3REYXRhR2V0KCkKCmdldCB0aGUgb2JqZWN0IGRhdGEgZnJvbSBhIHRlbXBsYXRlCgogICAgbXkgJE9iamVjdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9vYmplY3QgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVPYmplY3REYXRhOwp9Cgo9aXRlbSBPYmplY3REYXRhU2F2ZSgpCgpzYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBPYmplY3REYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte09iamVjdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ09iamVjdERhdGEgbXVzdCBiZSBhbiBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBkYXRhCiAgICAkU2VsZi0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICgga2V5cyAleyAkUGFyYW17T2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtPYmplY3REYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X29iamVjdCAnCiAgICAgICAgICAgICAgICAuICcodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgJwogICAgICAgICAgICAgICAgLiAnKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBPYmplY3REYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X29iamVjdCBXSEVSRSB0ZW1wbGF0ZV9pZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gRm9ybWF0TGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIGF2YWlsYWJsZSBmb3JtYXRzIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1hdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7Cgo9Y3V0CgpzdWIgRm9ybWF0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZwogICAgbXkgJE1vZHVsZUxpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgogICAgcmV0dXJuIGlmICEkTW9kdWxlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJE1vZHVsZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY3JlYXRlIHRoZSBmb3JtYXQgbGlzdAogICAgbXkgJEZvcm1hdExpc3QgPSB7fTsKICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JE1vZHVsZUxpc3R9ICkgewogICAgICAgICRGb3JtYXRMaXN0LT57JE1vZHVsZX0gPSAkTW9kdWxlTGlzdC0+eyRNb2R1bGV9LT57TmFtZX07CiAgICB9CgogICAgcmV0dXJuICRGb3JtYXRMaXN0Owp9Cgo9aXRlbSBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhIGZvcm1hdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgZm9ybWF0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICVQYXJhbSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gRm9ybWF0RGF0YUdldCgpCgpnZXQgdGhlIGZvcm1hdCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRGb3JtYXREYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRm9ybWF0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEZvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybWF0RGF0YTsKfQoKPWl0ZW0gRm9ybWF0RGF0YVNhdmUoKQoKc2F2ZSB0aGUgZm9ybWF0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgRm9ybWF0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdGb3JtYXREYXRhIG11c3QgYmUgYW4gaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgZGF0YQogICAgJFNlbGYtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIGtleXMgJXsgJFBhcmFte0Zvcm1hdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17Rm9ybWF0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9mb3JtYXQgJwogICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRm9ybWF0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIGZvcm1hdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9mb3JtYXQgV0hFUkUgdGVtcGxhdGVfaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1pdGVtIE1hcHBpbmdMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgbWFwcGluZyBkYXRhIGlkcyBzb3J0ZWQgYnkgcG9zaXRpb24gYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJE1hcHBpbmdMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/IE9SREVSIEJZIHBvc2l0aW9uJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBNYXBwaW5nTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATWFwcGluZ0xpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxATWFwcGluZ0xpc3Q7Cn0KCj1pdGVtIE1hcHBpbmdBZGQoKQoKYWRkIGEgbmV3IG1hcHBpbmcgZGF0YSByb3cKCiAgICBteSAkTWFwcGluZ0lEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0FkZCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZmluZCBtYXhpbXVtIHBvc2l0aW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG1heChwb3NpdGlvbikgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTmV3UG9zaXRpb24gPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRSb3dbMF0gKSB7CiAgICAgICAgICAgICROZXdQb3NpdGlvbiA9ICRSb3dbMF07CiAgICAgICAgICAgICROZXdQb3NpdGlvbisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGluc2VydCBhIG5ldyBtYXBwaW5nIGRhdGEgcm93CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X21hcHBpbmcgKHRlbXBsYXRlX2lkLCBwb3NpdGlvbikgVkFMVUVTICg/LCA/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkTmV3UG9zaXRpb24gXSwKICAgICk7CgogICAgIyBmaW5kIGlkIG9mIG5ldyBtYXBwaW5nIGRhdGEgcm93CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJE5ld1Bvc2l0aW9uIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTWFwcGluZ0lEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ0lEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJE1hcHBpbmdJRDsKfQoKPWl0ZW0gTWFwcGluZ0RlbGV0ZSgpCgpkZWxldGUgZXhpc3RpbmcgbWFwcGluZyBkYXRhIHJvd3MKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17TWFwcGluZ0lEfSApIHsKCiAgICAgICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgICAgICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgb25lIG1hcHBpbmcgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICAgICApOwoKICAgICAgICAjIHJlYnVpbGQgbWFwcGluZyBwb3NpdGlvbnMKICAgICAgICAkU2VsZi0+TWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAgICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgbWFwcGluZyBkYXRhCiAgICAgICAgICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYWxsIG1hcHBpbmcgcm93cyBvZiB0aGlzIHRlbXBsYXRlCiAgICAgICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgICk7CiAgICB9Cn0KCj1pdGVtIE1hcHBpbmdVcCgpCgptb3ZlIGFuIG1hcHBpbmcgZGF0YSByb3cgdXAKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdVcCgKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdVcCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte01hcHBpbmdJRH0gPT0gJE1hcHBpbmdMaXN0LT5bMF07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBwb3NpdGlvbiBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFBvc2l0aW9uOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUG9zaXRpb24gPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAxIGlmICEkUG9zaXRpb247CgogICAgbXkgJFBvc2l0aW9uVXBwZXIgPSAkUG9zaXRpb24gLSAxOwoKICAgICMgdXBkYXRlIHBvc2l0aW9ucwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb24sIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkUG9zaXRpb25VcHBlciBdLAogICAgKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQb3NpdGlvblVwcGVyLCBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdEb3duKCkKCm1vdmUgYW4gbWFwcGluZyBkYXRhIHJvdyBkb3duCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRG93bigKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEb3duIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbWFwcGluZyBkYXRhIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMSBpZiAkUGFyYW17TWFwcGluZ0lEfSA9PSAkTWFwcGluZ0xpc3QtPlstMV07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBwb3NpdGlvbiBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFBvc2l0aW9uOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUG9zaXRpb24gPSAkUm93WzBdOwogICAgfQoKICAgIG15ICRQb3NpdGlvbkRvd24gPSAkUG9zaXRpb24gKyAxOwoKICAgICMgdXBkYXRlIHBvc2l0aW9ucwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb24sIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkUG9zaXRpb25Eb3duIF0sCiAgICApOwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uRG93biwgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nUG9zaXRpb25SZWJ1aWxkKCkKCnJlYnVpbGQgdGhlIHBvc2l0aW9ucyBvZiBhIG1hcHBpbmcgbGlzdAoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdQb3NpdGlvblJlYnVpbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyB1cGRhdGUgcG9zaXRpb24KICAgIG15ICRDb3VudGVyID0gMDsKICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJENvdW50ZXIsIFwkTWFwcGluZ0lEIF0sCiAgICAgICAgKTsKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57T2JqZWN0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIG9iamVjdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgJVBhcmFtLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3REYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17TWFwcGluZ0lEfSApIHsKICAgICAgICAkUGFyYW17TWFwcGluZ0lEfSA9IFsgJFBhcmFte01hcHBpbmdJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtNYXBwaW5nSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkTWFwcGluZ0lEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtNYXBwaW5nSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGRlbGV0ZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmdfb2JqZWN0IFdIRVJFIG1hcHBpbmdfaWQgSU4gKCAkTWFwcGluZ0lEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gTWFwcGluZ09iamVjdERhdGFTYXZlKCkKCnNhdmUgdGhlIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+IDEyMywKICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIE1hcHBpbmdPYmplY3REYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdPYmplY3REYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nT2JqZWN0RGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgb2JqZWN0IHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCAnCiAgICAgICAgICAgICAgICAuICcobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTWFwcGluZ09iamVjdERhdGFHZXQoKQoKZ2V0IHRoZSBvYmplY3QgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3REYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCBXSEVSRSBtYXBwaW5nX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVNYXBwaW5nT2JqZWN0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1hcHBpbmdPYmplY3REYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJU1hcHBpbmdPYmplY3REYXRhOwp9Cgo9aXRlbSBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gZm9ybWF0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIGZvcm1hdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgJVBhcmFtLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBNYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIGZvcm1hdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXREYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17TWFwcGluZ0lEfSApIHsKICAgICAgICAkUGFyYW17TWFwcGluZ0lEfSA9IFsgJFBhcmFte01hcHBpbmdJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtNYXBwaW5nSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkTWFwcGluZ0lEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtNYXBwaW5nSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGRlbGV0ZSBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmdfZm9ybWF0IFdIRVJFIG1hcHBpbmdfaWQgSU4gKCAkTWFwcGluZ0lEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdERhdGFTYXZlKCkKCnNhdmUgdGhlIGZvcm1hdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFTYXZlKAogICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+IDEyMywKICAgICAgICBNYXBwaW5nRm9ybWF0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIE1hcHBpbmdGb3JtYXREYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nRm9ybWF0RGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgJFNlbGYtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgZm9ybWF0IHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCAnCiAgICAgICAgICAgICAgICAuICcobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdERhdGFHZXQoKQoKZ2V0IHRoZSBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhR2V0KAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCBXSEVSRSBtYXBwaW5nX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVNYXBwaW5nRm9ybWF0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1hcHBpbmdGb3JtYXREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJU1hcHBpbmdGb3JtYXREYXRhOwp9Cgo9aXRlbSBTZWFyY2hBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgc2VhcmNoIGF0dHJpYnV0ZXMgb2YgYSBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57T2JqZWN0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gc2VhcmNoIGF0dHJpYnV0ZSBsaXN0IG9mIGFuIG9iamVjdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIFNlYXJjaERhdGFHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkU2VhcmNoRGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X3NlYXJjaCBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVNlYXJjaERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTZWFyY2hEYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaERhdGE7Cn0KCj1pdGVtIFNlYXJjaERhdGFTYXZlKCkKCnNhdmUgdGhlIHNlYXJjaCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFNlYXJjaERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFNlYXJjaERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU2VhcmNoRGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEKICAgICRTZWxmLT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtTZWFyY2hEYXRhfSB9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtTZWFyY2hEYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgISREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfc2VhcmNoICcKICAgICAgICAgICAgICAgIC4gJyh0ZW1wbGF0ZV9pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFNlYXJjaERhdGFEZWxldGUoKQoKZGVsZXRlIHRoZSBleGlzdGluZyBzZWFyY2ggZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfc2VhcmNoIFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBFeHBvcnQoKQoKZXhwb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkV4cG9ydCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRGb3JtYXRCYWNrZW5kOwoKICAgICMgZ2V0IGV4cG9ydCBkYXRhCiAgICBteSAkRXhwb3J0RGF0YSA9ICRPYmplY3RCYWNrZW5kLT5FeHBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVSZXN1bHQ7CiAgICAkUmVzdWx0e1N1Y2Nlc3N9ICAgICAgICAgICAgPSAwOwogICAgJFJlc3VsdHtGYWlsZWR9ICAgICAgICAgICAgID0gMDsKICAgICRSZXN1bHR7RGVzdGluYXRpb25Db250ZW50fSA9IFtdOwoKICAgIEVYUE9SVERBVEFST1c6CiAgICBmb3IgbXkgJEV4cG9ydERhdGFSb3cgKCBAeyRFeHBvcnREYXRhfSApIHsKCiAgICAgICAgIyBleHBvcnQgb25lIHJvdwogICAgICAgIG15ICREZXN0aW5hdGlvbkNvbnRlbnRSb3cgPSAkRm9ybWF0QmFja2VuZC0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRFeHBvcnREYXRhUm93LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggIWRlZmluZWQgJERlc3RpbmF0aW9uQ29udGVudFJvdyApIHsKICAgICAgICAgICAgJFJlc3VsdHtGYWlsZWR9Kys7CiAgICAgICAgICAgIG5leHQgRVhQT1JUREFUQVJPVzsKICAgICAgICB9CgogICAgICAgICMgYWRkIHJvdyB0byBkZXN0aW5hdGlvbiBjb250ZW50CiAgICAgICAgcHVzaCBAeyAkUmVzdWx0e0Rlc3RpbmF0aW9uQ29udGVudH0gfSwgJERlc3RpbmF0aW9uQ29udGVudFJvdzsKICAgICAgICAkUmVzdWx0e1N1Y2Nlc3N9Kys7CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiRXhwb3J0IG9mICRSZXN1bHR7RmFpbGVkfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IGZhaWxlZCEiLAogICAgKTsKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJFeHBvcnQgb2YgJFJlc3VsdHtTdWNjZXNzfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IHN1Y2Nlc3MhIiwKICAgICk7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBJbXBvcnQoKQoKaW1wb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkltcG9ydCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTdHJpbmdSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRGb3JtYXRCYWNrZW5kOwoKICAgICMgZ2V0IGltcG9ydCBkYXRhCiAgICBteSAkSW1wb3J0RGF0YSA9ICRGb3JtYXRCYWNrZW5kLT5JbXBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJFBhcmFte1NvdXJjZUNvbnRlbnR9LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEltcG9ydERhdGE7CgogICAgbXkgJVJlc3VsdDsKICAgICRSZXN1bHR7U3VjY2Vzc30gPSAwOwogICAgJFJlc3VsdHtGYWlsZWR9ICA9IDA7CgogICAgSU1QT1JUREFUQVJPVzoKICAgIGZvciBteSAkSW1wb3J0RGF0YVJvdyAoIEB7JEltcG9ydERhdGF9ICkgewoKICAgICAgICAjIGltcG9ydCBvbmUgcm93CiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkT2JqZWN0QmFja2VuZC0+SW1wb3J0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+ICRJbXBvcnREYXRhUm93LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkUmVzdWx0e0ZhaWxlZH0rKzsKICAgICAgICAgICAgbmV4dCBJTVBPUlREQVRBUk9XOwogICAgICAgIH0KCiAgICAgICAgJFJlc3VsdHtTdWNjZXNzfSsrOwogICAgfQoKICAgICMgbG9nIHJlc3VsdAogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkltcG9ydCBvZiAkUmVzdWx0e0ZhaWxlZH0gcmVjb3JkcyAoJFRlbXBsYXRlRGF0YS0+e09iamVjdH0pOiBmYWlsZWQhIiwKICAgICk7CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0IG9mICRSZXN1bHR7U3VjY2Vzc30gcmVjb3JkcyAoJFRlbXBsYXRlRGF0YS0+e09iamVjdH0pOiBzdWNjZXNzISIsCiAgICApOwoKICAgIHJldHVybiBcJVJlc3VsdDsKfQoKPWl0ZW0gX0xvYWRCYWNrZW5kKCkKCnRvIGxvYWQgYSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgbW9kdWxlCgogICAgJEhhc2hSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpUaWNrZXQnLAogICAgKTsKCj1jdXQKCnN1YiBfTG9hZEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgb2JqZWN0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntMb2FkQmFja2VuZH0tPnsgJFBhcmFte01vZHVsZX0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57TG9hZEJhY2tlbmR9LT57ICRQYXJhbXtNb2R1bGV9IH07CgogICAgIyBsb2FkIG9iamVjdCBiYWNrZW5kIG1vZHVsZQogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJFBhcmFte01vZHVsZX0gKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJFBhcmFte01vZHVsZX0hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkUGFyYW17TW9kdWxlfS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICAgICBJbXBvcnRFeHBvcnRPYmplY3QgPT4gJFNlbGYsCiAgICApOwoKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtNb2R1bGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSB0aGUgb2JqZWN0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0xvYWRCYWNrZW5kfS0+eyAkUGFyYW17TW9kdWxlfSB9ID0gJEJhY2tlbmRPYmplY3Q7CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMyICQgJERhdGU6IDIwMDkvMDcvMjAgMjI6NTU6MjMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtIC0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBDU1YKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENTVi5wbSx2IDEuMjUgMjAwOS8wNy8yMCAyMjo1NToyMyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI1ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YgLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIENTVgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IGEgY3N2IGZvcm1hdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRJbXBvcnRFeHBvcnRPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTWFpbk9iamVjdCBJbXBvcnRFeHBvcnRPYmplY3QpKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ1RleHQ6OkNTVicpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ1BBTiBtb2R1bGUgVGV4dDo6Q1NWIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgQ1NWIGltcG9ydC9leHBvcnQgbW9kdWxlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbmUgYXZhaWxhYmxlIHNlcGVyYXRvcnMKICAgICRTZWxmLT57QXZhaWxhYmxlU2VwZXJhdG9yc30gPSB7CiAgICAgICAgVGFidWxhdG9yID0+ICJcdCIsCiAgICAgICAgU2VtaWNvbG9uID0+ICc7JywKICAgICAgICBDb2xvbiAgICAgPT4gJzonLAogICAgICAgIERvdCAgICAgICA9PiAnLicsCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybWF0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIGZvcm1hdCBhdHRyaWJ1dGVzIG9mIGEgZm9ybWF0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkRm9ybWF0QmFja2VuZC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBVc2VySUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb2x1bW5TZXBlcmF0b3InLAogICAgICAgICAgICBOYW1lICA9PiAnQ29sdW1uIFNlcGVyYXRvcicsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUYWJ1bGF0b3IgPT4gJ1RhYnVsYXRvciAoVEFCKScsCiAgICAgICAgICAgICAgICAgICAgU2VtaWNvbG9uID0+ICdTZW1pY29sb24gKDspJywKICAgICAgICAgICAgICAgICAgICBDb2xvbiAgICAgPT4gJ0NvbG9uICg6KScsCiAgICAgICAgICAgICAgICAgICAgRG90ICAgICAgID0+ICdEb3QgKC4pJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDaGFyc2V0JywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NoYXJzZXQnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDIwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBtYXBwaW5nIGF0dHJpYnV0ZXMgb2YgYW4gZm9ybWF0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkRm9ybWF0QmFja2VuZC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBVc2VySUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb2x1bW4nLAogICAgICAgICAgICBOYW1lICA9PiAnQ29sdW1uJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0RUTCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAnJFFEYXRheyJDb3VudGVyIn0nLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIEltcG9ydERhdGFHZXQoKQoKZ2V0IGltcG9ydCBkYXRhIGFzIDJELWFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmQtPkltcG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU3RyaW5nUmVmLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gW10gaWYgIWRlZmluZWQgJFBhcmFte1NvdXJjZUNvbnRlbnR9OwoKICAgICMgY2hlY2sgc291cmNlIGNvbnRlbnQKICAgIGlmICggcmVmICRQYXJhbXtTb3VyY2VDb250ZW50fSBuZSAnU0NBTEFSJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NvdXJjZUNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CiAgICAkQ2hhcnNldCA9fiBzeyBccyogKHV0Zi04fHV0ZjgpIFxzKiB9e1VURi04fXhtc2k7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAhJENoYXJzZXQgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2hhcnNldCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhcnNldAogICAgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBlcmF0b3J9IHx8PSAnJzsKICAgIG15ICRTZXBlcmF0b3IgPSAkU2VsZi0+e0F2YWlsYWJsZVNlcGVyYXRvcnN9LT57ICRGb3JtYXREYXRhLT57Q29sdW1uU2VwZXJhdG9yfSB9IHx8ICcnOwoKICAgICMgY2hlY2sgdGhlIHNlcGVyYXRvcgogICAgaWYgKCAhJFNlcGVyYXRvciApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBzZXBlcmF0b3IgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBwYXJzZXIgb2JqZWN0CiAgICBteSAkUGFyc2VPYmplY3QgPSBUZXh0OjpDU1YtPm5ldygKICAgICAgICB7CiAgICAgICAgICAgIHF1b3RlX2NoYXIgICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBlc2NhcGVfY2hhciAgICAgICAgID0+ICciJywKICAgICAgICAgICAgc2VwX2NoYXIgICAgICAgICAgICA9PiAkU2VwZXJhdG9yLAogICAgICAgICAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBhbHdheXNfcXVvdGUgICAgICAgID0+IDEsCiAgICAgICAgICAgIGJpbmFyeSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAga2VlcF9tZXRhX2luZm8gICAgICA9PiAwLAogICAgICAgICAgICBhbGxvd19sb29zZV9xdW90ZXMgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX2VzY2FwZXMgPT4gMCwKICAgICAgICAgICAgYWxsb3dfd2hpdGVzcGFjZSAgICA9PiAwLAogICAgICAgICAgICBibGFua19pc191bmRlZiAgICAgID0+IDAsCiAgICAgICAgICAgIHZlcmJhdGltICAgICAgICAgICAgPT4gMCwKICAgICAgICB9CiAgICApOwoKICAgICMgY3JlYXRlIGFuIGluIG1lbW9yeSB0ZW1wIGZpbGUgYW5kIG9wZW4gaXQKICAgIG15ICRGaWxlQ29udGVudDsKICAgIG9wZW4gbXkgJEZILCAnKzwnLCBcJEZpbGVDb250ZW50OwoKICAgICMgd3JpdGUgc291cmNlIGNvbnRlbnQKICAgIHByaW50ICRGSCAkeyAkUGFyYW17U291cmNlQ29udGVudH0gfTsKCiAgICAjIHJld2luZCBmaWxlIGhhbmRsZQogICAgc2VlayAkRkgsIDAsIDA7CgogICAgIyBwYXJzZSB0aGUgY29udGVudAogICAgbXkgQEltcG9ydERhdGE7CiAgICB3aGlsZSAoIG15ICRDb2x1bW4gPSAkUGFyc2VPYmplY3QtPmdldGxpbmUoJEZIKSApIHsKICAgICAgICBwdXNoIEBJbXBvcnREYXRhLCAkQ29sdW1uOwogICAgfQoKICAgICMgY2xvc2UgdGhlIGluIG1lbW9yeSBmaWxlIGhhbmRsZQogICAgY2xvc2UgJEZIOwoKICAgIHJldHVybiBcQEltcG9ydERhdGEgaWYgJENoYXJzZXQgbmUgJ1VURi04JzsKCiAgICAjIHNldCB1dGY4IGZsYWcKICAgIGZvciBteSAkUm93IChASW1wb3J0RGF0YSkgewogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JFJvd30gKSB7CiAgICAgICAgICAgIEVuY29kZTo6X3V0Zjhfb24oJENlbGwpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBJbXBvcnREYXRhOwp9Cgo9aXRlbSBFeHBvcnREYXRhU2F2ZSgpCgpleHBvcnQgb25lIHJvdyBvZiB0aGUgZXhwb3J0IGRhdGEKCiAgICBteSAkRGVzdGluYXRpb25Db250ZW50ID0gJEZvcm1hdEJhY2tlbmQtPkV4cG9ydERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gMTIzLAogICAgICAgIEV4cG9ydERhdGFSb3cgPT4gJEFycmF5UmVmLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBFeHBvcnREYXRhUm93IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBleHBvcnQgZGF0YSByb3cKICAgIGlmICggcmVmICRQYXJhbXtFeHBvcnREYXRhUm93fSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRXhwb3J0RGF0YVJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9ybWF0IGRhdGEKICAgIGlmICggISRGb3JtYXREYXRhIHx8IHJlZiAkRm9ybWF0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmb3JtYXQgZGF0YSBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhcnNldAogICAgbXkgJENoYXJzZXQgPSAkRm9ybWF0RGF0YS0+e0NoYXJzZXR9IHx8PSAnJzsKICAgICRDaGFyc2V0ID1+IHN7IFxzKiAodXRmLTh8dXRmOCkgXHMqIH17VVRGLTh9eG1zaTsKCiAgICAjIGNoZWNrIHRoZSBjaGFyc2V0CiAgICBpZiAoICEkQ2hhcnNldCApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBjaGFyc2V0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjaGFyc2V0CiAgICAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGVyYXRvcn0gfHw9ICcnOwogICAgbXkgJFNlcGVyYXRvciA9ICRTZWxmLT57QXZhaWxhYmxlU2VwZXJhdG9yc30tPnsgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBlcmF0b3J9IH0gfHwgJyc7CgogICAgIyBjaGVjayB0aGUgc2VwZXJhdG9yCiAgICBpZiAoICEkU2VwZXJhdG9yICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIHNlcGVyYXRvciBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHBhcnNlciBvYmplY3QKICAgIG15ICRQYXJzZU9iamVjdCA9IFRleHQ6OkNTVi0+bmV3KAogICAgICAgIHsKICAgICAgICAgICAgcXVvdGVfY2hhciAgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICRTZXBlcmF0b3IsCiAgICAgICAgICAgIGVvbCAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMSwKICAgICAgICAgICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBrZWVwX21ldGFfaW5mbyAgICAgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgICAgICAgICBhbGxvd193aGl0ZXNwYWNlICAgID0+IDAsCiAgICAgICAgICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICAgICAgICAgdmVyYmF0aW0gICAgICAgICAgICA9PiAwLAogICAgICAgIH0KICAgICk7CgogICAgaWYgKCAhJFBhcnNlT2JqZWN0LT5jb21iaW5lKCBAeyAkUGFyYW17RXhwb3J0RGF0YVJvd30gfSApICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNvbWJpbmUgdGhlIGV4cG9ydCBkYXRhIHRvIGEgc3RyaW5nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIENTViBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkUGFyc2VPYmplY3QtPnN0cmluZzsKCiAgICByZXR1cm4gJFN0cmluZyBpZiAkQ2hhcnNldCBuZSAnVVRGLTgnOwoKICAgICMgc2V0IHV0ZjggZmxhZwogICAgRW5jb2RlOjpfdXRmOF9vbigkU3RyaW5nKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMjUgJCAkRGF0ZTogMjAwOS8wNy8yMCAyMjo1NToyMyAkCgo9Y3V0Cg==
IyAtLQojIEltcG9ydEV4cG9ydC50IC0gYWxsIGdlbmVyYWwgaW1wb3J0IGV4cG9ydCB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnQsdiAxLjE1IDIwMDkvMDUvMTggMDk6NDI6NTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCiRTZWxmLT57RW5jb2RlT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDIgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0ltcG9ydEV4cG9ydCcgLiAkQ291bnRlciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1JbXBvcnRFeHBvcnQtJyAuICRDb3VudGVyIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1JbXBvcnRFeHBvcnQtJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSB0ZW1wbGF0ZSBuYW1lcwpteSBAVGVtcGxhdGVOYW1lOwoKZm9yIG15ICRDb3VudGVyICggMSAuLiA1ICkgewoKICAgIHB1c2ggQFRlbXBsYXRlTmFtZSwgJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBvYmplY3QgbmFtZXMKbXkgQE9iamVjdE5hbWU7CnB1c2ggQE9iamVjdE5hbWUsICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgojIGNyZWF0ZSBuZWVkZWQgZm9ybWF0IG5hbWVzCm15IEBGb3JtYXROYW1lID0gKCdDU1YnKTsKCiMgZ2V0IG9yaWdpbmFsIHRlbXBsYXRlIGxpc3QgZm9yIGxhdGVyIGNoZWNrcyAoYWxsIGVsZW1lbnRzKQpteSAkVGVtcGxhdGVMaXN0MUFsbCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGdldCBvcmlnaW5hbCB0ZW1wbGF0ZSBsaXN0IGZvciBsYXRlciBjaGVja3MgKGFsbCBlbGVtZW50cykKbXkgJFRlbXBsYXRlTGlzdDFPYmplY3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50JywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSB0ZW1wbGF0ZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50IFVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQgVVBEQVRFMycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gIiBcdCBcbiBcciAiIC4gJE9iamVjdE5hbWVbMF0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIEZvcm1hdCAgPT4gIiBcdCBcbiBcciAiIC4gJEZvcm1hdE5hbWVbMF0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFRlbXBsYXRlTmFtZVsyXSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsyXSwKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFRlbXBsYXRlTmFtZVsyXSAuICJVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMl0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQgVVBEQVRFMScsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKHVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJyDGlSDGmCAnIC4gJE9iamVjdE5hbWVbMF0gLiAnIMa1IMa7ICcsCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJyDHkyDHoyAnIC4gJEZvcm1hdE5hbWVbMF0gLiAnIMelIMeuICcsCiAgICAgICAgICAgIE5hbWUgICAgPT4gJyDHtyDInCAnIC4gJFRlbXBsYXRlTmFtZVszXSAuICcgyJ4gyKAgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBDb21tZW50ID0+ICcg0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgID0+ICfGlcaYJyAuICRPYmplY3ROYW1lWzBdIC4gJ8a1xrsnLAogICAgICAgICAgICBGb3JtYXQgICA9PiAnx5PHoycgLiAkRm9ybWF0TmFtZVswXSAuICfHpceuJywKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ8e3IMicICcgLiAkVGVtcGxhdGVOYW1lWzNdIC4gJyDIniDIoCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICfRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqknLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSBAQWRkZWRUZW1wbGF0ZUlEczsKClRFTVBMQVRFOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CgogICAgaWYgKCAkSXRlbS0+e0FkZH0gKSB7CgogICAgICAgICMgYWRkIG5ldyB0ZW1wbGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCggJXsgJEl0ZW0tPntBZGR9IH0gKTsKCiAgICAgICAgaWYgKCRUZW1wbGF0ZUlEKSB7CiAgICAgICAgICAgIHB1c2ggQEFkZGVkVGVtcGxhdGVJRHMsICRUZW1wbGF0ZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVBZGQoKSAtIFRlbXBsYXRlS2V5OiAkVGVtcGxhdGVJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSggJFRlbXBsYXRlSUQsICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlQWRkKCkiICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGVtcGxhdGUgd2FzIGFkZGVkCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e0FkZH0tPntVc2VySUR9IHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIHRlbXBsYXRlCiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUF0dHJpYnV0ZSAoIGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUdldC0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVHZXQoKSAtICRUZW1wbGF0ZUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIGxhc3QgdGVtcGxhdGUgaWQgdmFyYWlibGUKICAgICAgICBpZiAoICEkQWRkZWRUZW1wbGF0ZUlEc1stMV0gKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBOTyBMQVNUIElURU0gSUQgR0lWRU4uIFBsZWFzZSBhZGQgYSB0ZW1wbGF0ZSBmaXJzdC4iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGxhc3QgVEVNUExBVEU7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgdGVtcGxhdGUKICAgICAgICBteSAkVXBkYXRlU3VjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgJXsgJEl0ZW0tPntVcGRhdGV9IH0sCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGVtcGxhdGUgd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVVwZGF0ZSgpIC0gVGVtcGxhdGVLZXk6ICRBZGRlZFRlbXBsYXRlSURzWy0xXSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVVcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZUdldCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSB8fCAxLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlR2V0LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUdldCgpIC0gJFRlbXBsYXRlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewoKICAgICMgaW5jcmVtZW50IHRoZSBjb3VudGVyCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZUxpc3QgdGVzdCAxIChjaGVjayBhcnJheSByZWZlcmVuY2VzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBhcnJheSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJFRlbXBsYXRlTGlzdDFBbGwgZXEgJ0FSUkFZJyAmJiByZWYgJFRlbXBsYXRlTGlzdDFPYmplY3QgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gYXJyYXkgcmVmZXJlbmNlcyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVMaXN0IHRlc3QgMiAobGlzdCBtdXN0IGJlIGVtcHR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBsaXN0CiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlTGlzdDFPYmplY3R9IGVxIDAsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGVtcHR5IGxpc3QiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlTGlzdCB0ZXN0IDIgKGNoZWNrIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVMaXN0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJFRlbXBsYXRlTGlzdDIgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gYXJyYXkgcmVmZXJlbmNlIiwKKTsKCm15ICRUZW1wbGF0ZUxpc3RDb3VudCA9IHNjYWxhciBAeyRUZW1wbGF0ZUxpc3QyfSAtIHNjYWxhciBAeyRUZW1wbGF0ZUxpc3QxQWxsfTsKCiMgY2hlY2sgY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zCiRTZWxmLT5UcnVlKAogICAgJFRlbXBsYXRlTGlzdENvdW50IGVxIHNjYWxhciBAQWRkZWRUZW1wbGF0ZUlEcywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZURlbGV0ZSB0ZXN0IDEgKGFkZCBvbmUgdGVtcGxhdGUgYW5kIGRlbGV0ZSBpdCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBhZGQgYSB0ZXN0IHRlbXBsYXRlCm15ICRUZW1wbGF0ZURlbGV0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzRdLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgaGF2ZSBvbmUgbW9yZSBlbGVtZW50CiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QxfSBlcSAoIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0Mn0gKSAtIDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIC0gbnVtYmVyIG9mIGxpc3RlZCBlbGVtZW50cyIsCik7CgojIGRlbGV0ZSB0aGUgbmV3IHRlbXBsYXRlCm15ICRUZW1wbGF0ZURlbGV0ZTEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEZWxldGVJRCwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgbGlzdCBtdXN0IGJlIHN1Y2Nlc3NmdWxsCiRTZWxmLT5UcnVlKAogICAgJFRlbXBsYXRlRGVsZXRlMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkiLAopOwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgaGF2ZSB0aGUgb3JpZ2luYWwgbnVtYmVyIG9mIGVsZW1lbnRzCiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QxfSBlcSBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDN9LAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSAtIG51bWJlciBvZiBsaXN0ZWQgZWxlbWVudHMiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlRGVsZXRlIHRlc3QgMiAoZGVsZXRlIGFsbCB1bml0dGVzdCB0ZW1wbGF0ZXMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkVGVtcGxhdGVJRCAoQEFkZGVkVGVtcGxhdGVJRHMpIHsKCiAgICAjIGRlbGV0ZSB0aGUgdGVtcGxhdGUKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBzdWNjZXNzCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIFRlbXBsYXRlSUQgJFRlbXBsYXRlSUQiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBPYmplY3RMaXN0IHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSB0ZXN0IGxpc3QKbXkgJE9iamVjdExpc3QxVGVzdExpc3QgPSB7CiAgICBVbml0VGVzdDEgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VW5pdFRlc3QxJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAxJywKICAgIH0sCiAgICBVbml0VGVzdDIgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VW5pdFRlc3QyJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAyJywKICAgIH0sCn07CgojIGdldCBvcmlnaW5hbCBvYmplY3QgbGlzdApteSAkT2JqZWN0TGlzdE9yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiMgc2V0IHRlc3QgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJE9iamVjdExpc3QxVGVzdExpc3QsCik7CgojIGdldCBvYmplY3QgbGlzdApteSAkT2JqZWN0TGlzdDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiMgbGlzdCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJE9iamVjdExpc3QxIGVxICdIQVNIJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IE9iamVjdExpc3QoKSAtIGhhc2ggcmVmZXJlbmNlIiwKKTsKCiMgY2hlY2sgdGhlIGxpc3QKS0VZOgpmb3IgbXkgJEtleSAoIGtleXMgJXskT2JqZWN0TGlzdDF9ICkgewoKICAgIGlmICggISRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX0gKSB7CiAgICAgICAgJE9iamVjdExpc3QxVGVzdExpc3QtPntEdW1teX0gPSAxOwogICAgfQoKICAgIG5leHQgS0VZIGlmICRPYmplY3RMaXN0MS0+eyRLZXl9IG5lICRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX0tPntOYW1lfTsKCiAgICBkZWxldGUgJE9iamVjdExpc3QxVGVzdExpc3QtPnskS2V5fTsKfQoKJFNlbGYtPlRydWUoCiAgICAhJXskT2JqZWN0TGlzdDFUZXN0TGlzdH0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBPYmplY3RMaXN0KCkgLSBjb250ZW50IGlzIHZhbGlkIiwKKTsKCiMgcmVzdG9yZSBvcmlnaW5hbCBvYmplY3QgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJE9iamVjdExpc3RPcmcsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0TGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgdGVzdCBsaXN0Cm15ICRGb3JtYXRMaXN0MVRlc3RMaXN0ID0gewogICAgVW5pdFRlc3QxID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MScsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMScsCiAgICB9LAogICAgVW5pdFRlc3QyID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MicsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMicsCiAgICB9LAp9OwoKIyBnZXQgb3JpZ2luYWwgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3RPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgojIHNldCB0ZXN0IGxpc3QKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0MVRlc3RMaXN0LAopOwoKIyBnZXQgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgojIGxpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRGb3JtYXRMaXN0MSBlcSAnSEFTSCcsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBoYXNoIHJlZmVyZW5jZSIsCik7CgojIGNoZWNrIHRoZSBsaXN0CktFWToKZm9yIG15ICRLZXkgKCBrZXlzICV7JEZvcm1hdExpc3QxfSApIHsKCiAgICBpZiAoICEkRm9ybWF0TGlzdDFUZXN0TGlzdC0+eyRLZXl9ICkgewogICAgICAgICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57RHVtbXl9ID0gMTsKICAgIH0KCiAgICBuZXh0IEtFWSBpZiAkRm9ybWF0TGlzdDEtPnskS2V5fSBuZSAkRm9ybWF0TGlzdDFUZXN0TGlzdC0+eyRLZXl9LT57TmFtZX07CgogICAgZGVsZXRlICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX07Cn0KCiRTZWxmLT5UcnVlKAogICAgISV7JEZvcm1hdExpc3QxVGVzdExpc3R9LAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0TGlzdCgpIC0gY29udGVudCBpcyB2YWxpZCIsCik7CgojIHJlc3RvcmUgb3JpZ2luYWwgZm9ybWF0IGxpc3QKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0T3JnLAopOwoKJFRlc3RDb3VudCsrOwoKMTsK
IyAtLQojIEltcG9ydEV4cG9ydEZvcm1hdENTVi50IC0gYWxsIGltcG9ydCBleHBvcnQgdGVzdHMgZm9yIHRoZSBDU1YgZm9ybWF0IGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydEZvcm1hdENTVi50LHYgMS44IDIwMDkvMDUvMTggMDk6NDI6NTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7CgokU2VsZi0+e0VuY29kZU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0Zvcm1hdEJhY2tlbmRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgaG9tZSBkaXJlY3RvcnkKJFNlbGYtPntIb21lfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CgojIGFkZCBzb21lIHRlc3QgdGVtcGxhdGVzIGZvciBsYXRlciBjaGVja3MKbXkgQFRlbXBsYXRlSURzOwpmb3IgKCAxIC4uIDMwICkgewoKICAgICMgYWRkIGEgdGVzdCB0ZW1wbGF0ZSBmb3IgbGF0ZXIgY2hlY2tzCiAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVBZGQoCiAgICAgICAgT2JqZWN0ICA9PiAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgTmFtZSAgICA9PiAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHB1c2ggQFRlbXBsYXRlSURzLCAkVGVtcGxhdGVJRDsKfQoKbXkgJFRlc3RDb3VudCA9IDE7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0TGlzdCB0ZXN0IDEgKGNoZWNrIENTViBpdGVtKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiMgY2hlY2sgZm9ybWF0IGxpc3QKJFNlbGYtPlRydWUoCiAgICAkRm9ybWF0TGlzdDEgJiYgcmVmICRGb3JtYXRMaXN0MSBlcSAnSEFTSCcgJiYgJEZvcm1hdExpc3QxLT57Q1NWfSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdExpc3QoKSAtIENTViBleGlzdHMiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEZvcm1hdEF0dHJpYnV0ZXNHZXQgdGVzdCAxIChjaGVjayBhdHRyaWJ1dGUgaGFzaCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKbXkgJEZvcm1hdEF0dHJpYnV0ZXNHZXQxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMF0sCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZvcm1hdCBhdHRyaWJ1dGUgcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgJEZvcm1hdEF0dHJpYnV0ZXNHZXQxICYmIHJlZiAkRm9ybWF0QXR0cmlidXRlc0dldDEgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGFycmF5IHJlZmVyZW5jZSIsCik7CgojIGRlZmluZSB0aGUgcmVmZXJlbmNlIGhhc2gKbXkgJEZvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlID0gWwogICAgewogICAgICAgIEtleSAgID0+ICdDb2x1bW5TZXBlcmF0b3InLAogICAgICAgIE5hbWUgID0+ICdDb2x1bW4gU2VwZXJhdG9yJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGFidWxhdG9yID0+ICdUYWJ1bGF0b3IgKFRBQiknLAogICAgICAgICAgICAgICAgU2VtaWNvbG9uID0+ICdTZW1pY29sb24gKDspJywKICAgICAgICAgICAgICAgIENvbG9uICAgICA9PiAnQ29sb24gKDopJywKICAgICAgICAgICAgICAgIERvdCAgICAgICA9PiAnRG90ICguKScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NoYXJzZXQnLAogICAgICAgIE5hbWUgID0+ICdDaGFyc2V0JywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAnVVRGLTgnLAogICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAyMCwKICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDIwLAogICAgICAgIH0sCiAgICB9LApdOwoKIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CgojIGR1bXAgdGhlIGxpc3QgZnJvbSBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKbXkgJEZvcm1hdEF0dHJpYnV0ZXNHZXREdW1wMSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRGb3JtYXRBdHRyaWJ1dGVzR2V0MSk7CgojIGR1bXAgdGhlIHJlZmVyZW5jZSB0YWJsZQpteSAkRm9ybWF0QXR0cmlidXRlc1JlZkR1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJEZvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlKTsKCiRTZWxmLT5UcnVlKAogICAgJEZvcm1hdEF0dHJpYnV0ZXNHZXREdW1wMSBlcSAkRm9ybWF0QXR0cmlidXRlc1JlZkR1bXAxLAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gYXR0cmlidXRlcyBvZiB0aGUgcm93IGFyZSBpZGVudGljYWwiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEZvcm1hdEF0dHJpYnV0ZXNHZXQgdGVzdCAyIChjaGVjayB3aXRoIG5vbiBleGlzdGluZyB0ZW1wbGF0ZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKbXkgJEZvcm1hdEF0dHJpYnV0ZXNHZXQyID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZmFsc2UgcmV0dXJuCiRTZWxmLT5GYWxzZSgKICAgICRGb3JtYXRBdHRyaWJ1dGVzR2V0MiwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGZhbHNlIHJldHVybiIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQgdGVzdCAxIChjaGVjayBhdHRyaWJ1dGUgaGFzaCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgbWFwcGluZyBmb3JtYXQgYXR0cmlidXRlcwpteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzBdLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGUgcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MSAmJiByZWYgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGFycmF5IHJlZmVyZW5jZSIsCik7CgojIGRlZmluZSB0aGUgcmVmZXJlbmNlIGhhc2gKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSA9IFsKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ29sdW1uJywKICAgICAgICBOYW1lICA9PiAnQ29sdW1uJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgID0+ICdEVEwnLAogICAgICAgICAgICBEYXRhICAgICA9PiAnJFFEYXRheyJDb3VudGVyIn0nLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAwLAogICAgICAgIH0sCiAgICB9LApdOwoKIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CgojIGR1bXAgdGhlIGxpc3QgZnJvbSBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldER1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MSk7CgojIGR1bXAgdGhlIHJlZmVyZW5jZSB0YWJsZQpteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNSZWZEdW1wMSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UpOwoKJFNlbGYtPlRydWUoCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXREdW1wMSBlcSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNSZWZEdW1wMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBhdHRyaWJ1dGVzIG9mIHRoZSByb3cgYXJlIGlkZW50aWNhbCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQgdGVzdCAyIChjaGVjayB3aXRoIG5vbiBleGlzdGluZyB0ZW1wbGF0ZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgbWFwcGluZyBmb3JtYXQgYXR0cmlidXRlcwpteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQyID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZhbHNlIHJldHVybgokU2VsZi0+RmFsc2UoCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGZhbHNlIHJldHVybiIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgSW1wb3J0RGF0YUdldCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSW1wb3J0RGF0YVRlc3RzID0gWwoKICAgICMgSW1wb3J0RGF0YUdldCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgSW1wb3J0RGF0YUdldCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gc291cmNlIGNvbnRlbnQgYXJlIGdpdmVuIChlbXB0eSBhcnJheSByZWZlcmVuY2UgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gW10sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gW10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiB7fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IG11c3QgYmUgYSBzY2FsYXIgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gZXhpc3RpbmcgdGVtcGxhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIHNlcGVyYXRvciBhbmQgY2hhcnNldCBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBzZXBlcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjaGFyc2V0IGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEdW1teScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNvbHVtbiBzZXBlcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiBidXQgc291cmNlIGNvbnRlbnQgaXMgZW1wdHkgKGVtcHR5IGFycmF5IHJlZmVyZW5jZSBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzNdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geycnfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gW10sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgaXMgb25seSBhIHN0cmluZyB3aXRoIHNwYWNlcyAob25lIGNlbGwgYXJyYXkgd2l0aCB0aGUgc3BhY2VzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7JyAgJ30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWycgICddLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiwgYnV0IFRhYnVsYXRvciBpcyB1c2VkIGFzIHNlcGVyYXRvciAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWydSb3cxLUNvbDE7Um93MS1Db2wyO1JvdzEtQ29sMyddLAogICAgICAgICAgICBbJ1JvdzItQ29sMTtSb3cyLUNvbDI7Um93Mi1Db2wzJ10sCiAgICAgICAgICAgIFsnUm93My1Db2wxO1JvdzMtQ29sMjtSb3czLUNvbDMnXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4sIGJ1dCBTZW1pY29sb24gaXMgdXNlZCBhcyBzZXBlcmF0b3IgKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsiUm93MS1Db2wxXHRSb3cxLUNvbDJcdFJvdzEtQ29sMyJdLAogICAgICAgICAgICBbIlJvdzItQ29sMVx0Um93Mi1Db2wyXHRSb3cyLUNvbDMiXSwKICAgICAgICAgICAgWyJSb3czLUNvbDFcdFJvdzMtQ29sMlx0Um93My1Db2wzIl0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgIlRlc3QgMSAtIDIiLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgJ1Rlc3QgMSAtIDInLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgIlRlc3QgMSAtIDIiLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgIlRlc3QgMSAtIDIiLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNi1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxMF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfKqSDKrCDKricsICAgICAnIMqhIMukIM6MICcgXSwKICAgICAgICAgICAgWyAnICDOlyDPlyDPoCAgJywgJ86GIM6bIM6eJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgSW1wb3J0RGF0YUdldCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpURVNUOgpmb3IgbXkgJFRlc3QgKCBAeyRJbXBvcnREYXRhVGVzdHN9ICkgewoKICAgICMgY2hlY2sgU291cmNlSW1wb3J0RGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU291cmNlSW1wb3J0RGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBJbXBvcnREYXRhR2V0CiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gKSB7CiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9ID0ge307CiAgICB9CgogICAgIyBzZXQgc291cmNlIGNvbnRlbnQKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57U291cmNlRmlsZX0KICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntTb3VyY2VDb250ZW50fQogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9IGVxICdTb3VyY2VGaWxlJwogICAgICAgICkKICAgIHsKCiAgICAgICAgbXkgJFNvdXJjZUZpbGUgPSAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57U291cmNlRmlsZX07CgogICAgICAgICMgcmVhZCBzb3VyY2UgZmlsZQogICAgICAgIG15ICRTb3VyY2VDb250ZW50ID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZVJlYWQoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRTZWxmLT57SG9tZX0gLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvJyAuICRTb3VyY2VGaWxlLAogICAgICAgICAgICBSZXN1bHQgICA9PiAnU0NBTEFSJywKICAgICAgICAgICAgTW9kZSAgICAgPT4gJ2Jpbm1vZGUnLAogICAgICAgICk7CgogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9ID0gJFNvdXJjZUNvbnRlbnQ7CiAgICB9CgogICAgIyBzZXQgdGhlIGZvcm1hdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0Zvcm1hdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBzYXZlIGZvcm1hdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57Rm9ybWF0RGF0YX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGltcG9ydCBkYXRhCiAgICBteSAkSW1wb3J0RGF0YSA9ICRTZWxmLT57Rm9ybWF0QmFja2VuZE9iamVjdH0tPkltcG9ydERhdGFHZXQoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9IH0sCiAgICApOwoKICAgIGlmICggISRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJEltcG9ydERhdGEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCByZWYgJEltcG9ydERhdGEgbmUgJ0FSUkFZJyApIHsKCiAgICAgICAgIyBjaGVjayBhcnJheSByZWZlcmVuY2UKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gcmV0dXJuIHZhbHVlIGlzIGFuIGFycmF5IHJlZmVyZW5jZSIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgY2hlY2sgbnVtYmVyIG9mIHJvd3MKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskSW1wb3J0RGF0YX0sCiAgICAgICAgc2NhbGFyIEB7ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0gfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSBzYW1lIG51bWJlciBvZiByb3dzIiwKICAgICk7CgogICAgIyBjaGVjayBjb250ZW50IG9mIGltcG9ydCBkYXRhCiAgICBteSAkQ291bnRlclJvdyA9IDA7CiAgICBST1c6CiAgICBmb3IgbXkgJEltcG9ydFJvdyAoIEB7JEltcG9ydERhdGF9ICkgewoKICAgICAgICAjIGV4dHJhY3QgcmVmZXJlbmNlIHJvdwogICAgICAgIG15ICRSZWZlcmVuY2VSb3cgPSAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT5bJENvdW50ZXJSb3ddOwoKICAgICAgICBpZiAoIHJlZiAkSW1wb3J0Um93IG5lICdBUlJBWScgfHwgcmVmICRSZWZlcmVuY2VSb3cgbmUgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICMgY2hlY2sgYXJyYXkgcmVmZXJlbmNlCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIGltcG9ydCByb3cgYW5kIHJlZmVyZW5jZSByb3cgbWF0Y2hlZCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFRFU1Q7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG51bWJlciBvZiBjb2x1bW5zCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskSW1wb3J0Um93fSwKICAgICAgICAgICAgc2NhbGFyIEB7JFJlZmVyZW5jZVJvd30sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyQ29sdW1uID0gMDsKICAgICAgICBmb3IgbXkgJENlbGwgKCBAeyRJbXBvcnRSb3d9ICkgewoKICAgICAgICAgICAgIyBzZXQgY29udGVudCBpZiB2YWx1ZXMgYXJlIHVuZGVmCiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJENlbGwgKSB7CiAgICAgICAgICAgICAgICAkQ2VsbCA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dICkgewogICAgICAgICAgICAgICAgJFJlZmVyZW5jZVJvdy0+WyRDb3VudGVyQ29sdW1uXSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgY2VsbCBkYXRhCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRDZWxsLAogICAgICAgICAgICAgICAgJFJlZmVyZW5jZVJvdy0+WyRDb3VudGVyQ29sdW1uXSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50ZXJDb2x1bW4rKzsKICAgICAgICB9CgogICAgICAgICRDb3VudGVyUm93Kys7CiAgICB9Cn0KY29udGludWUgewogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgRXhwb3J0RGF0YVNhdmUgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEV4cG9ydERhdGFUZXN0cyA9IFsKCiAgICAjIEV4cG9ydERhdGFTYXZlIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSByb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IHt9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gZXhpc3RpbmcgdGVtcGxhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIHNlcGVyYXRvciBhbmQgY2hhcnNldCBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gc2VwZXJhdG9yIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhcnNldCA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNoYXJzZXQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNvbHVtbiBzZXBlcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSBvbmUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzIChvbmUgZW1wdHkgY2VsbCBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiOyIiOyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJycsICcnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIlwiXHRcIlwiXHRcIlwiIiwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiOiIiOiIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJycsICcnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIi4iIi4iIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJzsiIjsnLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IGFuZCB1bmRlZiBjb250ZW50ICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgdW5kZWYsICcnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcdFwiXCJcdCIsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnOiIiOicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJy4iIi4nLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAiXCJSb3cxLUNvbDFcIlx0XCJSb3cxLUNvbDJcIlx0XCJSb3cxLUNvbDNcIiIsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyJSb3cxLUNvbDEiOiJSb3cxLUNvbDIiOiJSb3cxLUNvbDMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyJSb3cxLUNvbDEiLiJSb3cxLUNvbDIiLiJSb3cxLUNvbDMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICJcblRlc3QgMSIsICJUZXN0IFxuIDIiLCAnVGVzdCAzIFxuXHRcclxzJywgIlRlc3QgNFxuIiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+IHFxeyJcblRlc3QgMSI7IlRlc3QgXG4gMiI7IlRlc3QgMyBcXG5cXHRcXHJcXHMiOyJUZXN0IDRcbiJ9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgcXF7IlxuVGVzdCAxIlx0IlRlc3QgXG4gMiJcdCJUZXN0IDMgXFxuXFx0XFxyXFxzIlx0IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICJcblRlc3QgMSIsICJUZXN0IFxuIDIiLCAnVGVzdCAzIFxuXHRcclxzJywgIlRlc3QgNFxuIiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+IHFxeyJcblRlc3QgMSI6IlRlc3QgXG4gMiI6IlRlc3QgMyBcXG5cXHRcXHJcXHMiOiJUZXN0IDRcbiJ9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIi4iVGVzdCBcbiAyIi4iVGVzdCAzIFxcblxcdFxcclxccyIuIlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIjsiICAgICI7IlRlc3QgICI7IiAgICBUZXN0IjsiIjsiVGVzdCI7IiI7IiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICJcIiAgVGVzdCAgXCJcdFwiICAgIFwiXHRcIlRlc3QgIFwiXHRcIiAgICBUZXN0XCJcdFwiXCJcdFwiVGVzdFwiXHRcIlwiXHRcIiBcIiIsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciICBUZXN0ICAiOiIgICAgIjoiVGVzdCAgIjoiICAgIFRlc3QiOiIiOiJUZXN0IjoiIjoiICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIgIFRlc3QgICIuIiAgICAiLiJUZXN0ICAiLiIgICAgVGVzdCIuIiIuIlRlc3QiLiIiLiIgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiOyI+PEB+XCd9e1tdXCI7IiI7IiIiIiI7Ozo6Li4tLV9fIyMiJwogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol9eISIkJSYvKCk9P2AqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICc+PEB+XCd9e1tdXFwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICAnIlRlc3Q7Ol9eISIiJCUmLygpPT9gKitUZXN0IicKICAgICAgICAgICAgLiAiXHQiCiAgICAgICAgICAgIC4gJyI+PEB+XCd9e1tdXFwiJwogICAgICAgICAgICAuICJcdCIKICAgICAgICAgICAgLiAnIiInCiAgICAgICAgICAgIC4gIlx0IgogICAgICAgICAgICAuICciIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiOiI+PEB+XCd9e1tdXCI6IiI6IiIiIiI7Ozo6Li4tLV9fIyMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCIuIj48QH5cJ317W11cXCIuIiIuIiIiIiI7Ozo6Li4tLV9fIyMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyDRqiDRrCDRsicsICfRryDRtCDRvycsICfSgiDSiiDSliAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIg0aog0awg0bIiOyLRryDRtCDRvyI7ItKCINKKINKWICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAiXCIg0aog0awg0bJcIlx0XCLRryDRtCDRv1wiXHRcItKCINKKINKWIFwiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiDRqiDRrCDRsiI6ItGvING0ING/Ijoi0oIg0oog0pYgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciINGqINGsINGyIi4i0a8g0bQg0b8iLiLSgiDSiiDSliAiJywKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgRXhwb3J0RGF0YVNhdmUgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskRXhwb3J0RGF0YVRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNvdXJjZUV4cG9ydERhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZUV4cG9ydERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgRXhwb3J0RGF0YVNhdmUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0gKSB7CiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSA9IHt9OwogICAgfQoKICAgICMgc2V0IHRoZSBmb3JtYXQgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57Rm9ybWF0RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgZm9ybWF0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57Rm9ybWF0RGF0YX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGV4cG9ydCBkYXRhIHJvdwogICAgbXkgJEV4cG9ydFN0cmluZyA9ICRTZWxmLT57Rm9ybWF0QmFja2VuZE9iamVjdH0tPkV4cG9ydERhdGFTYXZlKAogICAgICAgICV7ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0gfSwKICAgICk7CgogICAgaWYgKCAhZGVmaW5lZCAkVGVzdC0+e1JlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudH0gKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAhZGVmaW5lZCAkRXhwb3J0U3RyaW5nLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRFeHBvcnRTdHJpbmcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAhZGVmaW5lZCAkVGVzdC0+e1JlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudH0sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkgLSByZXR1cm4gZmFsc2UiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0tPntFeHBvcnREYXRhUm93fSApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGRlZmluZWQgJEV4cG9ydFN0cmluZywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBjaGVjayB0aGUgZXhwb3J0IHN0cmluZwogICAgJFNlbGYtPklzKAogICAgICAgICRFeHBvcnRTdHJpbmcsCiAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnR9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkiLAogICAgKTsKfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbiB0aGUgc3lzdGVtCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVsZXRlIHRoZSB0ZXN0IHRlbXBsYXRlcwokU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgVGVtcGxhdGVJRCA9PiBcQFRlbXBsYXRlSURzLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKMTsK
Um93MS1Db2wxO1JvdzEtQ29sMjtSb3cxLUNvbDMNClJvdzItQ29sMTtSb3cyLUNvbDI7Um93Mi1Db2wzDQpSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMw0K
Um93MS1Db2wxCVJvdzEtQ29sMglSb3cxLUNvbDMNClJvdzItQ29sMQlSb3cyLUNvbDIJUm93Mi1Db2wzDQpSb3czLUNvbDEJUm93My1Db2wyCVJvdzMtQ29sMw0K
IlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOiJSb3cyLUNvbDIiOiJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjoiUm93My1Db2wyIjoiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiUm93My1Db2wyIjsiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSIJIlJvdzEtQ29sMiIJIlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiCSJSb3cyLUNvbDIiCSJSb3cyLUNvbDMiDQoiUm93My1Db2wxIgkiUm93My1Db2wyIgkiUm93My1Db2wzIg0K
IgpUZXN0IDEgLSAxIjtUZXN0IDEgLSAyOyJUZXN0IDEKLSAzIjtUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiOyJUZQpzdCAyIC0gMiI7IlRlc3QgMiAtIDMKIjsNCg==
IgpUZXN0IDEgLSAxIglUZXN0IDEgLSAyCSJUZXN0IDEKLSAzIglUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiCSJUZQpzdCAyIC0gMiIJIlRlc3QgMiAtIDMKIgkNCg==
IgpUZXN0IDEgLSAxIjoiVGVzdCAxIC0gMiI6IlRlc3QgMQotIDMiOiJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjoiVGUKc3QgMiAtIDIiOiJUZXN0IDIgLSAzCiI6DQo=
IgpUZXN0IDEgLSAxIjsiVGVzdCAxIC0gMiI7IlRlc3QgMQotIDMiOyJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjsiVGUKc3QgMiAtIDIiOyJUZXN0IDIgLSAzCiI7DQo=
IgpUZXN0IDEgLSAxIgkiVGVzdCAxIC0gMiIJIlRlc3QgMQotIDMiCSJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIgkiVGUKc3QgMiAtIDIiCSJUZXN0IDIgLSAzCiIJDQo=
ICBUZXN0ICA7ICAgIDtUZXN0ICANCiAgICBUZXN0OztUZXN0DQo7OyANCg==
ICBUZXN0ICAJICAgIAlUZXN0ICANCiAgICBUZXN0CQlUZXN0DQoJCSANCg==
IiAgVGVzdCAgIjoiICAgICI6IlRlc3QgICINCiIgICAgVGVzdCI6OiJUZXN0Ig0KOjoiICINCg==
IiAgVGVzdCAgIjsiICAgICI7IlRlc3QgICINCiIgICAgVGVzdCI7OyJUZXN0Ig0KOzsiICINCg==
IiAgVGVzdCAgIgkiICAgICIJIlRlc3QgICINCiIgICAgVGVzdCIJCSJUZXN0Ig0KCQkiICINCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Ijs+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyI7DQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Igk+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyIJDQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjoiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjoNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjsiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjsNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IgkiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIgkNCg==
/Pbk3zvc1sQNCt/k9vw7xNbcDQo=
/Pbk3wnc1sQNCt/k9vwJxNbcDQo=
Ivz25N8iOiLc1sQiDQoi3+T2/CI6IsTW3CINCg==
Ivz25N8iOyLc1sQiDQoi3+T2/CI7IsTW3CINCg==
Ivz25N8iCSLc1sQiDQoi3+T2/CIJIsTW3CINCg==
IsqpIMqsIMquIjsiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOyLOhiDOmyDOniINCg==
IsqpIMqsIMquIjoiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOiLOhiDOmyDOniINCg==
IsqpIMqsIMquIgkiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiCSLOhiDOmyDOniINCg==