ImportExport
1.1.3
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Build for OTRS::ITSM 1.1.3.
Build for OTRS::ITSM 1.1.2.
Build for OTRS::ITSM 1.1.1.
Build for OTRS::ITSM 1.1.0 rc1.
Build for OTRS::ITSM 1.1.0 beta4.
Build for OTRS::ITSM 1.1.0 beta3.
Build for OTRS::ITSM 1.1.0 beta2.
Build for OTRS::ITSM 1.1.0 beta1.
Testbuild for OTRS::ITSM 1.1.0 beta1.
The ImportExport package.
Das ImportExport Paket.
2.2.8
2.2.x CVS
<br>
WELCOME<br>
<br>
You are about to install the OTRS module ImportExport.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul ImportExport zu installieren.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WELCOME<br>
<br>
You are about to upgrade the OTRS module ImportExport.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul ImportExport zu aktualisieren.<br>
<br>
<br>
((enjoy))<br>
<br>
2008-08-25 12:24:20
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBJbXBvcnRFeHBvcnQucGwgLSBpbXBvcnQvZXhwb3J0IHNjcmlwdAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBsLHYgMS44LjIuMSAyMDA4LzA4LzA3IDEwOjU0OjEwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEZpbmRCaW4gcXcoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pIC4gJy9LZXJuZWwvY3Bhbi1saWInOwoKdXNlIEdldG9wdDo6U3RkOwp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OICRSZWFsQmluKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOC4yLjEgJCkgWzFdOwoKIyBnZXQgb3B0aW9ucwpteSAlT3B0czsKZ2V0b3B0KCAnaG5haW8nLCBcJU9wdHMgKTsKCmlmICggJE9wdHN7aH0gKSB7CgogICAgcHJpbnQgU1RET1VUICJJbXBvcnRFeHBvcnQucGwgPFJldmlzaW9uICRWRVJTSU9OPiAtIGEgaW1wb3J0L2V4cG9ydCB0b29sXG4iOwogICAgcHJpbnQgU1RET1VUICJDb3B5cmlnaHQgKGMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvXG4iOwogICAgcHJpbnQgU1RET1VUICJ1c2FnZTpJbXBvcnRFeHBvcnQucGwgLW4gPFRlbXBsYXRlTnVtYmVyPiAtYSBpbXBvcnR8ZXhwb3J0ICI7CiAgICBwcmludCBTVERPVVQgIlstaSA8U291cmNlRmlsZT5dIFstbyA8RGVzdGluYXRpb25GaWxlPl1cbiI7CiAgICBwcmludCBTVERPVVQgIlxuIjsKICAgIHByaW50IFNURE9VVCAiICAgZXhhbXBsZXM6XG4iOwogICAgcHJpbnQgU1RET1VUICIgICAgICAgSW1wb3J0RXhwb3J0LnBsIC1uIDAwMDA0IC1hIGltcG9ydCAtaSAvdG1wL2ltcG9ydC5jc3ZcbiI7CiAgICBwcmludCBTVERPVVQgIiAgICAgICBJbXBvcnRFeHBvcnQucGwgLW4gMDAwMDQgLWEgZXhwb3J0IC1vIC90bXAvZXhwb3J0LmNzdlxuIjsKCiAgICBleGl0IDE7Cn0KCiMgY2hlY2sgdGVtcGFsdGUgbnVtYmVyCmlmICggISRPcHRze259ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogTmVlZCAtbiBUZW1wbGF0ZU51bWJlclxuIjsKICAgIGV4aXQgMTsKfQppZiAoICRPcHRze259ICF+IG17IFxBIFxkKyBceiB9eG1zICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogSW52YWxpZCBUZW1wbGF0ZU51bWJlclxuIjsKICAgIGV4aXQgMTsKfQpteSAkVGVtcGxhdGVJRCA9IGludCAkT3B0c3tufTsKCiMgY2hlY2sgYWN0aW9uIG1vZGUKaWYgKCAhJE9wdHN7YX0gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBOZWVkIC1hIGltcG9ydHxleHBvcnRcbiI7CiAgICBleGl0IDE7Cn0KaWYgKCBsYyAkT3B0c3thfSBuZSAnaW1wb3J0JyAmJiBsYyAkT3B0c3thfSBuZSAnZXhwb3J0JyApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IEludmFsaWQgYWN0aW9uXG4iOwogICAgZXhpdCAxOwp9CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwpteSAlQ29tbW9uT2JqZWN0OwokQ29tbW9uT2JqZWN0e0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiRDb21tb25PYmplY3R7TG9nT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgIExvZ1ByZWZpeCA9PiAnT1RSUy1JbXBvcnRFeHBvcnQnLAogICAgJUNvbW1vbk9iamVjdCwKKTsKJENvbW1vbk9iamVjdHtFbmNvZGVPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e01haW5PYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0RCT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldyglQ29tbW9uT2JqZWN0KTsKJENvbW1vbk9iamVjdHtJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCVDb21tb25PYmplY3QpOwoKIyBnZXQgdGVtcGxhdGUgZGF0YQpteSAkVGVtcGxhdGVEYXRhID0gJENvbW1vbk9iamVjdHtJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgppZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBUZW1wbGF0ZSAkT3B0c3tufSBub3QgZm91bmQhXG4iOwogICAgcHJpbnQgU1RERVJSICJFeHBvcnQgYWJvcnRlZC5cbiI7CiAgICBleGl0IDE7Cn0KCiMgdGltZSB0byBzdGFydAppZiAoIGxjICRPcHRze2F9IGVxICdpbXBvcnQnICkgewoKICAgIG15ICRTb3VyY2VDb250ZW50ID0gXGRvIHsnJ307CiAgICBpZiAoICRPcHRze2l9ICkgewoKICAgICAgICBwcmludCBTVERPVVQgIlJlYWQgRmlsZSAkT3B0c3tpfS5cbiI7CgogICAgICAgICMgcmVhZCBzb3VyY2UgZmlsZQogICAgICAgICRTb3VyY2VDb250ZW50ID0gJENvbW1vbk9iamVjdHtNYWluT2JqZWN0fS0+RmlsZVJlYWQoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRPcHRze2l9LAogICAgICAgICAgICBSZXN1bHQgICA9PiAnU0NBTEFSJywKICAgICAgICAgICAgTW9kZSAgICAgPT4gJ2Jpbm1vZGUnLAogICAgICAgICk7CgogICAgICAgIGRpZSAiQ2FuJ3QgcmVhZCBmaWxlICRPcHRze2l9LlxuSW1wb3J0IGFib3J0ZWQuXG4iIGlmICEkU291cmNlQ29udGVudDsKICAgIH0KCiAgICBwcmludCBTVERPVVQgIkltcG9ydCBpbiBwcm9jZXNzLi4uXG4iOwoKICAgICMgaW1wb3J0IGRhdGEKICAgIG15ICRSZXN1bHQgPSAkQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0tPkltcG9ydCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJFNvdXJjZUNvbnRlbnQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCiAgICBkaWUgIlxuRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLlxuIiBpZiAhZGVmaW5lZCAkUmVzdWx0OwoKICAgIHByaW50IFNURE9VVCAiXG4iOwogICAgcHJpbnQgU1RET1VUICJTdWNjZXNzOiAkUmVzdWx0LT57U3VjY2Vzc31cbiI7CiAgICBwcmludCBTVERPVVQgIkZhaWxlZCA6ICRSZXN1bHQtPntGYWlsZWR9XG4iOwogICAgcHJpbnQgU1RET1VUICJcbiI7CiAgICBwcmludCBTVERPVVQgIkltcG9ydCBjb21wbGV0ZS5cbiI7Cn0KZWxzaWYgKCBsYyAkT3B0c3thfSBlcSAnZXhwb3J0JyApIHsKCiAgICBwcmludCBTVERPVVQgIkV4cG9ydCBpbiBwcm9jZXNzLi4uXG4iOwoKICAgICMgZXhwb3J0IGRhdGEKICAgIG15ICRSZXN1bHQgPSAkQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0tPkV4cG9ydCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgZGllICJcbkVycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy5cbiIgaWYgIWRlZmluZWQgJFJlc3VsdDsKCiAgICBwcmludCBTVERPVVQgIlxuIjsKICAgIHByaW50IFNURE9VVCAiU3VjY2VzczogJFJlc3VsdC0+e1N1Y2Nlc3N9XG4iOwogICAgcHJpbnQgU1RET1VUICJGYWlsZWQgOiAkUmVzdWx0LT57RmFpbGVkfVxuIjsKICAgIHByaW50IFNURE9VVCAiXG4iOwoKICAgIGlmICggJE9wdHN7b30gKSB7CgogICAgICAgIG15ICRGaWxlQ29udGVudCA9IGpvaW4gIlxuIiwgQHsgJFJlc3VsdC0+e0Rlc3RpbmF0aW9uQ29udGVudH0gfTsKCiAgICAgICAgIyBzYXZlIGRlc3RpbmF0aW9uIGNvbnRlbnQgdG8gZmlsZQogICAgICAgIG15ICRTdWNjZXNzID0gJENvbW1vbk9iamVjdHtNYWluT2JqZWN0fS0+RmlsZVdyaXRlKAogICAgICAgICAgICBMb2NhdGlvbiA9PiAkT3B0c3tvfSwKICAgICAgICAgICAgQ29udGVudCAgPT4gXCRGaWxlQ29udGVudCwKICAgICAgICApOwoKICAgICAgICBkaWUgIkNhbid0IHdyaXRlIGZpbGUgJE9wdHN7b30uXG5FeHBvcnQgYWJvcnRlZC5cbiIgaWYgISRTdWNjZXNzOwoKICAgICAgICBwcmludCBTVERPVVQgIkZpbGUgJE9wdHN7b30gc2F2ZWQuXG4iOwogICAgfQoKICAgIHByaW50IFNURE9VVCAiRXhwb3J0IGNvbXBsZXRlLlxuIjsKfQoKZXhpdCAwOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjguMi4xICQgJERhdGU6IDIwMDgvMDgvMDcgMTA6NTQ6MTAgJAoKPWN1dAo=
cGFja2FnZSBUZXh0OjpDU1Y7CgoKdXNlIHN0cmljdDsKdXNlIENhcnAgKCk7CgpCRUdJTiB7CiAgICAkVGV4dDo6Q1NWOjpWRVJTSU9OID0gJzEuMDYnOwogICAgJFRleHQ6OkNTVjo6REVCVUcgICA9IDA7Cn0KCiMgaWYgdXNlIENTVl9YUywgcmVxdWlyZXMgdmVyc2lvbgpteSAkTW9kdWxlX1hTICA9ICdUZXh0OjpDU1ZfWFMnOwpteSAkTW9kdWxlX1BQICA9ICdUZXh0OjpDU1ZfUFAnOwpteSAkWFNfVmVyc2lvbiA9ICcwLjUxJzsKCm15ICRJc19EeW5hbWljID0gMDsKCiMgdXNlZCBpbiBfbG9hZF94cyBhbmQgX2xvYWRfcHAKbXkgJEluc3RhbGxfRG9udF9EaWUgPSAxOyAjIFdoZW4gX2xvYWRfeHMgZmFpbHMgdG8gbG9hZCBYUywgZG9uJ3QgZGllLgpteSAkSW5zdGFsbF9Pbmx5ICAgICA9IDI7ICMgRG9uJ3QgY2FsbCBfc2V0X21ldGhvZHMoKQoKCm15IEBQdWJsaWNNZXRob2RzID0gcXcvCiAgICB2ZXJzaW9uIHR5cGVzIHF1b3RlX2NoYXIgZXNjYXBlX2NoYXIgc2VwX2NoYXIgZW9sIGFsd2F5c19xdW90ZSBiaW5hcnkgYWxsb3dfd2hpdGVzcGFjZQogICAga2VlcF9tZXRhX2luZm8gYWxsb3dfbG9vc2VfcXVvdGVzIGFsbG93X2xvb3NlX2VzY2FwZXMgdmVyYmF0aW0gbWV0YV9pbmZvIGlzX3F1b3RlZCBpc19iaW5hcnkgZW9mCiAgICBnZXRsaW5lIHByaW50IHBhcnNlIGNvbWJpbmUgZmllbGRzIHN0cmluZyBlcnJvcl9kaWFnIGVycm9yX2lucHV0IHN0YXR1cyBibGFua19pc191bmRlZgogICAgZ2V0bGluZV9ociBjb2x1bW5fbmFtZXMgYmluZF9jb2x1bW5zCiAgICBQViBJViBOVgovOwojCm15IEBVbmRvY3VtZW50ZWRYU01ldGhvZHMgPSBxdy9Db21iaW5lIFBhcnNlIFNldERpYWcvOwoKbXkgQFVuZG9jdW1lbnRlZFBQTWV0aG9kcyA9IHF3Ly87ICMgQ3VycmVudGx5IGVtcHR5CgoKIyBDaGVjayB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGVjaWRlIHdvcmtlciBtb2R1bGUuIAoKdW5sZXNzICgkVGV4dDo6Q1NWOjpXb3JrZXIpIHsKICAgICRUZXh0OjpDU1Y6OkRFQlVHIGFuZCAgQ2FycDo6Y2FycCgiQ2hlY2sgdXNlZCB3b3JrZXIgbW9kdWxlLi4uIik7CgogICAgaWYgKCBleGlzdHMgJEVOVntQRVJMX1RFWFRfQ1NWfSApIHsKICAgICAgICBpZiAoJEVOVntQRVJMX1RFWFRfQ1NWfSBlcSAnMCcgb3IgJEVOVntQRVJMX1RFWFRfQ1NWfSBlcSAnVGV4dDo6Q1NWX1BQJykgewogICAgICAgICAgICBfbG9hZF9wcCgpOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJEVOVntQRVJMX1RFWFRfQ1NWfSBlcSAnMScgb3IgJEVOVntQRVJMX1RFWFRfQ1NWfSA9fiAvVGV4dDo6Q1NWX1hTXHMqLFxzKlRleHQ6OkNTVl9QUC8pIHsKICAgICAgICAgICAgX2xvYWRfeHMoJEluc3RhbGxfRG9udF9EaWUpIG9yIF9sb2FkX3BwKCk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRU5We1BFUkxfVEVYVF9DU1Z9IGVxICcyJyBvciAkRU5We1BFUkxfVEVYVF9DU1Z9IGVxICdUZXh0OjpDU1ZfWFMnKSB7CiAgICAgICAgICAgIF9sb2FkX3hzKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBDYXJwOjpjcm9hayAiVGhlIHZhbHVlIG9mIGVudmlyb25tZW50YWwgdmFyaWFibGUgJ1BFUkxfVEVYVF9DU1YnIGlzIGludmFsaWQuIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBfbG9hZF94cygkSW5zdGFsbF9Eb250X0RpZSkgb3IgX2xvYWRfcHAoKTsKICAgIH0KCn0KCgoKc3ViIGltcG9ydCB7CiAgICBteSAoJGNsYXNzLCAkb3B0aW9uKSA9IEBfOwp9CgoKCnN1YiBuZXcgeyAjIG5vcm1hbCBtb2RlCiAgICBteSAkcHJvdG8gPSBzaGlmdDsKICAgIG15ICRjbGFzcyA9IHJlZigkcHJvdG8pIHx8ICRwcm90bzsKCiAgICB1bmxlc3MgKCAkcHJvdG8gKSB7ICMgZm9yIFRleHQ6OkNTVl9YUy9QUDo6bmV3KDApOwogICAgICAgIHJldHVybiBldmFsIHFxfCAkVGV4dDo6Q1NWOjpXb3JrZXJcOjpuZXcoIFwkcHJvdG8gKSB8OwogICAgfQoKICAgICNpZiAocmVmICRfWzBdIGFuZCAkX1swXS0+e21vZHVsZX0pIHsKICAgICMgICAgQ2FycDo6Y3JvYWsoIkNhbid0IHNldCAnbW9kdWxlJyBpbiBub24gZHluYW1pYyBtb2RlLiIpOwogICAgI30KCiAgICBpZiAoIG15ICRvYmogPSAkVGV4dDo6Q1NWOjpXb3JrZXItPm5ldyhAXykgKSB7CiAgICAgICAgJG9iai0+e19NT0RVTEV9ID0gJFRleHQ6OkNTVjo6V29ya2VyOwogICAgICAgIGJsZXNzICRvYmosICRjbGFzczsKICAgICAgICByZXR1cm4gJG9iajsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KCgp9CgoKc3ViIHJlcXVpcmVfeHNfdmVyc2lvbiB7ICRYU19WZXJzaW9uOyB9CgoKc3ViIG1vZHVsZSB7CiAgICBteSAkcHJvdG8gPSBzaGlmdDsKICAgIHJldHVybiAgICFyZWYoJHByb3RvKSAgICAgICAgICAgID8gJFRleHQ6OkNTVjo6V29ya2VyCiAgICAgICAgICAgOiAgcmVmKCRwcm90by0+e19NT0RVTEV9KSA/IHJlZigkcHJvdG8tPntfTU9EVUxFfSkgOiAkcHJvdG8tPntfTU9EVUxFfTsKfQoKKmJhY2tlbmQgPSAqbW9kdWxlOwoKCnN1YiBpc194cyB7CiAgICByZXR1cm4gJF9bMF0tPm1vZHVsZSBlcSAkTW9kdWxlX1hTOwp9CgoKc3ViIGlzX3BwIHsKICAgIHJldHVybiAkX1swXS0+bW9kdWxlIGVxICRNb2R1bGVfUFA7Cn0KCgpzdWIgaXNfZHluYW1pYyB7ICRJc19EeW5hbWljOyB9CgoKc3ViIEFVVE9MT0FEIHsKICAgIG15ICRzZWxmID0gJF9bMF07CiAgICBteSAkYXR0ciA9ICRUZXh0OjpDU1Y6OkFVVE9MT0FEOwogICAgJGF0dHIgPX4gcy8uKjo6Ly87CgogICAgcmV0dXJuIGlmICRhdHRyID1+IC9eW0EtWl0rJC87CiAgICBDYXJwOjpjcm9hayggIkNhbid0IGxvY2F0ZSBtZXRob2QgJGF0dHIiICkgdW5sZXNzICRhdHRyID1+IC9eXy87CgogICAgbXkgJHBrZyA9ICRUZXh0OjpDU1Y6OldvcmtlcjsKCiAgICBteSAkbWV0aG9kID0gIiRwa2dcOjokYXR0ciI7CgogICAgJFRleHQ6OkNTVjo6REVCVUcgYW5kIENhcnA6OmNhcnAoIickYXR0cicgaXMgcHJpdmF0ZSBtZXRob2QsIHNvIHRyeSB0byBhdXRvbG9hZC4uLiIpOwoKICAgIGxvY2FsICReVzsKICAgIG5vIHN0cmljdCBxdyhyZWZzKTsKCiAgICAqeyJUZXh0OjpDU1Y6OiRhdHRyIn0gPSAqeyIkcGtnXDo6JGF0dHIifTsKCiAgICBnb3RvICYkYXR0cjsKfQoKCgpzdWIgX2xvYWRfeHMgewogICAgbXkgJG9wdCA9IHNoaWZ0OwoKICAgICRUZXh0OjpDU1Y6OkRFQlVHIGFuZCBDYXJwOjpjYXJwICJMb2FkICRNb2R1bGVfWFMuIjsKCiAgICBldmFsIHFxfCB1c2UgJE1vZHVsZV9YUyAkWFNfVmVyc2lvbiB8OwoKICAgIGlmICgkQCkgewogICAgICAgIGlmIChkZWZpbmVkICRvcHQgYW5kICRvcHQgJiAkSW5zdGFsbF9Eb250X0RpZSkgewogICAgICAgICAgICAkVGV4dDo6Q1NWOjpERUJVRyBhbmQgQ2FycDo6Y2FycCAiQ2FuJ3QgbG9hZCAkTW9kdWxlX1hTLi4uKCRAKSI7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBDYXJwOjpjcm9hayAkQDsKICAgIH0KCiAgICBwdXNoIEBUZXh0OjpDU1Y6OklTQSwgJ1RleHQ6OkNTVl9YUyc7CgogICAgdW5sZXNzIChkZWZpbmVkICRvcHQgYW5kICRvcHQgJiAkSW5zdGFsbF9Pbmx5KSB7CiAgICAgICAgX3NldF9tZXRob2RzKCAkVGV4dDo6Q1NWOjpXb3JrZXIgPSAkTW9kdWxlX1hTICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn07CgoKc3ViIF9sb2FkX3BwIHsKICAgIG15ICRvcHQgPSBzaGlmdDsKCiAgICAkVGV4dDo6Q1NWOjpERUJVRyBhbmQgQ2FycDo6Y2FycCAiTG9hZCAkTW9kdWxlX1BQLiI7CgogICAgZXZhbCBxcXwgcmVxdWlyZSAkTW9kdWxlX1BQIHw7CiAgICBpZiAoJEApIHsKICAgICAgICBDYXJwOjpjcm9hayAkQDsKICAgIH0KCiAgICBwdXNoIEBUZXh0OjpDU1Y6OklTQSwgJ1RleHQ6OkNTVl9QUCc7CgogICAgdW5sZXNzIChkZWZpbmVkICRvcHQgYW5kICRvcHQgJiAkSW5zdGFsbF9Pbmx5KSB7CiAgICAgICAgX3NldF9tZXRob2RzKCAkVGV4dDo6Q1NWOjpXb3JrZXIgPSAkTW9kdWxlX1BQICk7CiAgICB9Cn07CgoKCgpzdWIgX3NldF9tZXRob2RzIHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwoKICAgICNyZXR1cm47CgogICAgbG9jYWwgJF5XOwogICAgbm8gc3RyaWN0IHF3KHJlZnMpOwoKICAgIGZvciBteSAkbWV0aG9kIChAUHVibGljTWV0aG9kcykgewogICAgICAgICp7IlRleHQ6OkNTVjo6JG1ldGhvZCJ9ID0gXCZ7IiRjbGFzc1w6OiRtZXRob2QifTsKICAgIH0KCiAgICBpZiAoJFRleHQ6OkNTVjo6V29ya2VyIGVxICRNb2R1bGVfWFMpIHsKICAgICAgICBmb3IgbXkgJG1ldGhvZCAoQFVuZG9jdW1lbnRlZFhTTWV0aG9kcykgewogICAgICAgICAgICAqeyJUZXh0OjpDU1Y6OiRtZXRob2QifSA9IFwmeyIkTW9kdWxlX1hTXDo6JG1ldGhvZCJ9OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJFRleHQ6OkNTVjo6V29ya2VyIGVxICRNb2R1bGVfUFApIHsKICAgICAgICBmb3IgbXkgJG1ldGhvZCAoQFVuZG9jdW1lbnRlZFBQTWV0aG9kcykgewogICAgICAgICAgICAqeyJUZXh0OjpDU1Y6OiRtZXRob2QifSA9IFwmeyIkTW9kdWxlX1BQXDo6JG1ldGhvZCJ9OwogICAgICAgIH0KICAgIH0KCn0KCgoKMTsKX19FTkRfXwoKPXBvZAoKPWhlYWQxIE5BTUUKClRleHQ6OkNTViAtIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMgbWFuaXB1bGF0b3IgKHVzaW5nIFhTIG9yIFB1cmVQZXJsKQoKCj1oZWFkMSBTWU5PUFNJUwoKIHVzZSBUZXh0OjpDU1Y7CiAKICRjc3YgPSBUZXh0OjpDU1YtPm5ldygpOyAgICAgICAgICAgICAgIyBjcmVhdGUgYSBuZXcgb2JqZWN0CiAKICMgSWYgeW91IHdhbnQgdG8gaGFuZGxlIG5vbi1hc2NpaSBjaGFyLgogJGNzdiA9IFRleHQ6OkNTVi0+bmV3KHtiaW5hcnkgPT4gMX0pOwogCiAkc3RhdHVzID0gJGNzdi0+Y29tYmluZShAY29sdW1ucyk7ICAgICMgY29tYmluZSBjb2x1bW5zIGludG8gYSBzdHJpbmcKICRsaW5lICAgPSAkY3N2LT5zdHJpbmcoKTsgICAgICAgICAgICAgIyBnZXQgdGhlIGNvbWJpbmVkIHN0cmluZwogCiAkc3RhdHVzICA9ICRjc3YtPnBhcnNlKCRsaW5lKTsgICAgICAgICMgcGFyc2UgYSBDU1Ygc3RyaW5nIGludG8gZmllbGRzCiBAY29sdW1ucyA9ICRjc3YtPmZpZWxkcygpOyAgICAgICAgICAgICMgZ2V0IHRoZSBwYXJzZWQgZmllbGRzCiAKICRzdGF0dXMgICAgICAgPSAkY3N2LT5zdGF0dXMgKCk7ICAgICAgIyBnZXQgdGhlIG1vc3QgcmVjZW50IHN0YXR1cwogJGJhZF9hcmd1bWVudCA9ICRjc3YtPmVycm9yX2lucHV0ICgpOyAjIGdldCB0aGUgbW9zdCByZWNlbnQgYmFkIGFyZ3VtZW50CiAkZGlhZyAgICAgICAgID0gJGNzdi0+ZXJyb3JfZGlhZyAoKTsgICMgaWYgYW4gZXJyb3Igb2NjdXJlZCwgZXhwbGFpbnMgV0hZCiAKICRzdGF0dXMgPSAkY3N2LT5wcmludCAoJGlvLCAkY29scmVmKTsgIyBXcml0ZSBhbiBhcnJheSBvZiBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbW1lZGlhdGVseSB0byBhIGZpbGUgJGlvCiAkY29scmVmID0gJGNzdi0+Z2V0bGluZSAoJGlvKTsgICAgICAgICMgUmVhZCBhIGxpbmUgZnJvbSBmaWxlICRpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXJzZSBpdCBhbmQgcmV0dXJuIGFuIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVmIG9mIGZpZWxkcwogJGNzdi0+Y29sdW1uX25hbWVzIChAbmFtZXMpOyAgICAgICAgICAjIFNldCBjb2x1bW4gbmFtZXMgZm9yIGdldGxpbmVfaHIgKCkKICRyZWYgPSAkY3N2LT5nZXRsaW5lX2hyICgkaW8pOyAgICAgICAgIyBnZXRsaW5lICgpLCBidXQgcmV0dXJucyBhIGhhc2hyZWYKICRlb2YgPSAkY3N2LT5lb2YgKCk7ICAgICAgICAgICAgICAgICAgIyBJbmRpY2F0ZSBpZiBsYXN0IHBhcnNlIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0bGluZSAoKSBoaXQgRW5kIE9mIEZpbGUKIAogJGNzdi0+dHlwZXMoXEB0X2FycmF5KTsgICAgICAgICAgICAgICAjIFNldCBjb2x1bW4gdHlwZXMKCgo9aGVhZDEgREVTQ1JJUFRJT04KClRleHQ6OkNTViBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciB0aGUgY29tcG9zaXRpb24gYW5kIGRlY29tcG9zaXRpb24gb2YKY29tbWEtc2VwYXJhdGVkIHZhbHVlcyB1c2luZyBMPFRleHQ6OkNTVl9YUz4gb3IgaXRzIHB1cmUgUGVybCB2ZXJzaW9uLgoKQW4gaW5zdGFuY2Ugb2YgdGhlIFRleHQ6OkNTViBjbGFzcyBjYW4gY29tYmluZSBmaWVsZHMgaW50byBhIENTViBzdHJpbmcKYW5kIHBhcnNlIGEgQ1NWIHN0cmluZyBpbnRvIGZpZWxkcy4KClRoZSBtb2R1bGUgYWNjZXB0cyBlaXRoZXIgc3RyaW5ncyBvciBmaWxlcyBhcyBpbnB1dCBhbmQgY2FuIHV0aWxpemUgYW55CnVzZXItc3BlY2lmaWVkIGNoYXJhY3RlcnMgYXMgZGVsaW1pdGVycywgc2VwYXJhdG9ycywgYW5kIGVzY2FwZXMgc28gaXQgaXMKcGVyaGFwcyBiZXR0ZXIgY2FsbGVkIEFTViAoYW55dGhpbmcgc2VwYXJhdGVkIHZhbHVlcykgcmF0aGVyIHRoYW4ganVzdCBDU1YuCgo9aGVhZDEgVkVSU0lPTgoKICAgIDEuMDYKClRoaXMgbW9kdWxlIGlzIGNvbXBhdGlibGUgd2l0aCBUZXh0OjpDU1ZfWFMgQjwwLjUxPiBvciBsYXRlci4KCj1oZWFkMiBCSU5BUlkgTU9ERQoKVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gb25seSBhY2NlcHQgYXNjaWkgY2hhcmFjdGVycy4KSW4gbWFueSBjYXNlcywgeW91IHNob3VsZCBjcmVhdGUgYSBUZXh0OjpDU1Ygb2JqZWN0IHdpdGgKYmluYXJ5IG1vZGUuCgogbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3KHtiaW5hcnkgPT4gMX0pOwoKU2VlIHRvIEw8VGV4dDo6Q1NWX1hTL0VtYmVkZGVkIG5ld2xpbmVzPi4KCj1oZWFkMiBVbmljb2RlIChVVEY4KQoKT24gcGFyc2luZyAoYm90aCBmb3IgQzxnZXRsaW5lICgpPiBhbmQgQzxwYXJzZSAoKT4pLCBpZiB0aGUgc291cmNlIGlzCm1hcmtlZCBiZWluZyBVVEY4LCB0aGVuIHBhcnNpbmcgdGhhdCBzb3VyY2Ugd2lsbCBtYXJrIGFsbCBmaWVsZHMgdGhhdAphcmUgbWFya2VkIGJpbmFyeSB3aWxsIGFsc28gYmUgbWFya2VkIFVURjguCgpPbiBjb21iaW5pbmcgKEM8cHJpbnQgKCk+IGFuZCBDPGNvbWJpbmUgKCk+KSwgaWYgYW55IG9mIHRoZSBjb21iaW5pbmcKZmllbGRzIHdhcyBtYXJrZWQgVVRGOCwgdGhlIHJlc3VsdGluZyBzdHJpbmcgd2lsbCBiZSBtYXJrZWQgVVRGOC4KCj1oZWFkMSBTUEVDSUZJQ0FUSU9OCgpTZWUgdG8gTDxUZXh0OjpDU1ZfWFMvU1BFQ0lGSUNBVElPTj4uCgo9aGVhZDEgRlVOQ1RJT05TCgpUaGVzZSBtZXRob2RzIGFyZSBjb21tb24gYmV0d2VlbiBYUyBhbmQgcHVlciBQZXJsIHZlcnNpb24uCk1vc3Qgb2YgdGhlIGRvY3VtZW50IHdhcyBzaGFtZWxlc3NseSBjb3BpZWQgYW5kIHJlcGxhY2VkIGZyb20gVGV4dDo6Q1NWX1hTLgoKPWhlYWQyIHZlcnNpb24gKCkKCihDbGFzcyBtZXRob2QpIFJldHVybnMgdGhlIGN1cnJlbnQgYmFja2VuZCBtb2R1bGUgdmVyc2lvbi4KSWYgeW91IHdhbnQgdGhlIG1vZHVsZSB2ZXJzaW9uLCB5b3UgY2FuIHVzZSB0aGUgQzxWRVJTSU9OPiBtZXRob2QsCgogcHJpbnQgVGV4dDo6Q1NWLT5WRVJTSU9OOyAgICAgICMgVGhpcyBtb2R1bGUgdmVyc2lvbgogcHJpbnQgVGV4dDo6Q1NWLT52ZXJzaW9uOyAgICAgICMgVGhlIHZlcnNpb24gb2YgdGhlIHdvcmtlciBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbWUgYXMgVGV4dDo6Q1NWLT5iYWNrZW5kLT52ZXJzaW9uCgo9aGVhZDIgbmV3IChcJWF0dHIpCgooQ2xhc3MgbWV0aG9kKSBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIFRleHQ6OkNTVl9YUy4gVGhlIG9iamVjdHMKYXR0cmlidXRlcyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSAob3B0aW9uYWwpIGhhc2ggcmVmIEM8XCVhdHRyPi4KQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlOgoKPW92ZXIgNAoKPWl0ZW0gZW9sCgpBbiBlbmQtb2YtbGluZSBzdHJpbmcgdG8gYWRkIHRvIHJvd3MsIHVzdWFsbHkgQzx1bmRlZj4gKG5vdGhpbmcsCmRlZmF1bHQpLCBDPCJcMDEyIj4gKExpbmUgRmVlZCkgb3IgQzwiXDAxNVwwMTIiPiAoQ2FycmlhZ2UgUmV0dXJuLApMaW5lIEZlZWQpLiBDYW5ub3QgYmUgbG9uZ2VyIHRoYW4gNyAoQVNDSUkpIGNoYXJhY3RlcnMuCgpJZiBib3RoIEM8JC8+IGFuZCBDPGVvbD4gZXF1YWwgQzwiXDAxNSI+LCBwYXJzaW5nIGxpbmVzIHRoYXQgZW5kIG9uCm9ubHkgYSBDYXJyaWFnZSBSZXR1cm4gd2l0aG91dCBMaW5lIEZlZWQsIHdpbGwgYmUgQzxwYXJzZT5kIGNvcnJlY3QuCkxpbmUgZW5kaW5ncywgd2hldGhlciBpbiBDPCQvPiBvciBDPGVvbD4sIG90aGVyIHRoYW4gQzx1bmRlZj4sCkM8IlxuIj4sIEM8IlxyXG4iPiwgb3IgQzwiXHIiPiBhcmUgbm90ICh5ZXQpIHN1cHBvcnRlZCBmb3IgcGFyc2luZy4KCj1pdGVtIHNlcF9jaGFyCgpUaGUgY2hhciB1c2VkIGZvciBzZXBhcmF0aW5nIGZpZWxkcywgYnkgZGVmYXVsdCBhIGNvbW1hLiAoQzwsPikuCkxpbWl0ZWQgdG8gYSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIsIHVzdWFsbHkgaW4gdGhlIHJhbmdlIGZyb20gMHgyMAooc3BhY2UpIHRvIDB4N2UgKHRpbGRlKS4KClRoZSBzZXBhcmF0aW9uIGNoYXJhY3RlciBjYW4gbm90IGJlIGVxdWFsIHRvIHRoZSBxdW90ZSBjaGFyYWN0ZXIuClRoZSBzZXBhcmF0aW9uIGNoYXJhY3RlciBjYW4gbm90IGJlIGVxdWFsIHRvIHRoZSBlc2NhcGUgY2hhcmFjdGVyLgoKPWl0ZW0gYWxsb3dfd2hpdGVzcGFjZQoKV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSwgd2hpdGVzcGFjZSAoVEFCJ3MgYW5kIFNQQUNFJ3MpCnN1cnJvdW5kaW5nIHRoZSBzZXBhcmF0aW9uIGNoYXJhY3RlciBpcyByZW1vdmVkIHdoZW4gcGFyc2luZy4gU28KbGluZXMgbGlrZToKCiAgMSAsICJmb28iICwgYmFyICwgMyAsIHphcHAKCmFyZSBub3cgY29ycmVjdGx5IHBhcnNlZCwgZXZlbiB0aG91Z2ggaXQgdmlvbGF0ZXMgdGhlIENTViBzcGVjcy4KTm90ZSB0aGF0IEI8YWxsPiB3aGl0ZXNwYWNlIGlzIHN0cmlwcGVkIGZyb20gc3RhcnQgYW5kIGVuZCBvZiBlYWNoCmZpZWxkLiBUaGF0IHdvdWxkIG1ha2UgaXMgbW9yZSBhIEk8ZmVhdHVyZT4gdGhhbiBhIHdheSB0byBiZSBhYmxlCnRvIHBhcnNlIGJhZCBDU1YgbGluZXMsIGFzCgogMSwgICAyLjAsICAzLCAgIGFwZSAgLCBtb25rZXkKCndpbGwgbm93IGJlIHBhcnNlZCBhcwoKICgiMSIsICIyLjAiLCAiMyIsICJhcGUiLCAibW9ua2V5IikKCmV2ZW4gaWYgdGhlIG9yaWdpbmFsIGxpbmUgd2FzIHBlcmZlY3RseSBzYW5lIENTVi4KCj1pdGVtIGJsYW5rX2lzX3VuZGVmCgpVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgQ1NWIGRhdGEgbWFrZXMgbm8gZGlzdGluY3Rpb24gYmV0d2VlbgpxdW90ZWQtIGFuZCB1bnF1b3RlZCBlbXB0eSBmaWVsZHMuIFRoZXkgYm90aCBlbmQgdXAgaW4gYW4gZW1wdHkKc3RyaW5nIGZpZWxkIG9uY2UgcmVhZCwgc28KCiAxLCIiLCwiICIsMgoKaXMgcmVhZCBhcwoKICgiMSIsICIiLCAiIiwgIiAiLCAiMiIpCgpXaGVuIEk8d3JpdGluZz4gQ1NWIGZpbGVzIHdpdGggQzxhbHdheXNfcXVvdGU+IHNldCwgdGhlIHVucXVvdGVkIGVtcHR5CmZpZWxkIGlzIHRoZSByZXN1bHQgb2YgYW4gdW5kZWZpbmVkIHZhbHVlLiBUbyBtYWtlIGl0IHBvc3NpYmxlIHRvIGFsc28KbWFrZSB0aGlzIGRpc3RpbmN0aW9uIHdoZW4gcmVhZGluZyBDU1YgZGF0YSwgdGhlIEM8YmxhbmtfaXNfdW5kZWY+IG9wdGlvbgp3aWxsIGNhdXNlIHVucXVvdGVkIGVtcHR5IGZpZWxkcyB0byBiZSBzZXQgdG8gdW5kZWYsIGNhdXNpbmcgdGhlIGFib3ZlIHRvCmJlIHBhcnNlZCBhcwoKICgiMSIsICIiLCB1bmRlZiwgIiAiLCAiMiIpCgo9aXRlbSBxdW90ZV9jaGFyCgpUaGUgY2hhciB1c2VkIGZvciBxdW90aW5nIGZpZWxkcyBjb250YWluaW5nIGJsYW5rcywgYnkgZGVmYXVsdCB0aGUKZG91YmxlIHF1b3RlIGNoYXJhY3RlciAoQzwiPikuIEEgdmFsdWUgb2YgdW5kZWYgc3VwcHJlc3NlcwpxdW90ZSBjaGFycy4gKEZvciBzaW1wbGUgY2FzZXMgb25seSkuCkxpbWl0ZWQgdG8gYSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIsIHVzdWFsbHkgaW4gdGhlIHJhbmdlIGZyb20gMHgyMAooc3BhY2UpIHRvIDB4N2UgKHRpbGRlKS4KClRoZSBxdW90ZSBjaGFyYWN0ZXIgY2FuIG5vdCBiZSBlcXVhbCB0byB0aGUgc2VwYXJhdGlvbiBjaGFyYWN0ZXIuCgo9aXRlbSBhbGxvd19sb29zZV9xdW90ZXMKCkJ5IGRlZmF1bHQsIHBhcnNpbmcgZmllbGRzIHRoYXQgaGF2ZSBDPHF1b3RlX2NoYXI+IGNoYXJhY3RlcnMgaW5zaWRlCmFuIHVucXVvdGVkIGZpZWxkLCBsaWtlCgogMSxmb28gImJhciIgYmF6LDQyCgp3b3VsZCByZXN1bHQgaW4gYSBwYXJzZSBlcnJvci4gVGhvdWdoIGl0IGlzIHN0aWxsIGJhZCBwcmFjdGljZSB0bwphbGxvdyB0aGlzIGZvcm1hdCwgd2UgY2Fubm90IGhlbHAgdGhlcmUgYXJlIHNvbWUgdmVuZG9ycyB0aGF0IG1ha2UKdGhlaXIgYXBwbGljYXRpb25zIHNwaXQgb3V0IGxpbmVzIHN0eWxlZCBsaWtlIHRoaXMuCgpJbiBjYXNlIHRoZXJlIGlzIEI8cmVhbGx5PiBiYWQgQ1NWIGRhdGEsIGxpa2UKCiAxLCJmb28gImJhciIgYmF6Iiw0MgoKb3IKCiAxLCIiZm9vIGJhciBiYXoiIiw0MgoKdGhlcmUgaXMgYSB3YXkgdG8gZ2V0IHRoYXQgcGFyc2VkLCBhbmQgbGVhdmUgdGhlIHF1b3RlcyBpbnNpZGUgdGhlIHF1b3RlZApmaWVsZCBhcy1pcy4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgc2V0dGluZyBDPGFsbG93X2xvb3NlX3F1b3Rlcz4gQjxBTkQ+Cm1ha2luZyBzdXJlIHRoYXQgdGhlIEM8ZXNjYXBlX2NoYXI+IGlzIEk8bm90PiBlcXVhbCB0byBDPHF1b3RlX2NoYXI+LgoKPWl0ZW0gZXNjYXBlX2NoYXIKClRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgZXNjYXBpbmcgY2VydGFpbiBjaGFyYWN0ZXJzIGluc2lkZSBxdW90ZWQgZmllbGRzLgpMaW1pdGVkIHRvIGEgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyLCB1c3VhbGx5IGluIHRoZSByYW5nZSBmcm9tIDB4MjAKKHNwYWNlKSB0byAweDdlICh0aWxkZSkuCgpUaGUgQzxlc2NhcGVfY2hhcj4gZGVmYXVsdHMgdG8gYmVpbmcgdGhlIGxpdGVyYWwgZG91YmxlLXF1b3RlIG1hcmsgKEM8Ij4pCmluIG90aGVyIHdvcmRzLCB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBDPHF1b3RlX2NoYXI+LiBUaGlzIG1lYW5zIHRoYXQKZG91YmxpbmcgdGhlIHF1b3RlIG1hcmsgaW4gYSBmaWVsZCBlc2NhcGVzIGl0OgoKICAiZm9vIiwiYmFyIiwiRXNjYXBlICIicXVvdGUgbWFyayIiIHdpdGggdHdvICIicXVvdGUgbWFya3MiIiIsImJheiIKCklmIHlvdSBjaGFuZ2UgdGhlIGRlZmF1bHQgcXVvdGVfY2hhciB3aXRob3V0IGNoYW5naW5nIHRoZSBkZWZhdWx0CmVzY2FwZV9jaGFyLCB0aGUgZXNjYXBlX2NoYXIgd2lsbCBzdGlsbCBiZSB0aGUgcXVvdGUgbWFyay4gIElmIGluc3RlYWQgCnlvdSB3YW50IHRvIGVzY2FwZSB0aGUgcXVvdGVfY2hhciBieSBkb3VibGluZyBpdCwgeW91IHdpbGwgbmVlZCB0byBjaGFuZ2UKdGhlIGVzY2FwZV9jaGFyIHRvIGJlIHRoZSBzYW1lIGFzIHdoYXQgeW91IGNoYW5nZWQgdGhlIHF1b3RlX2NoYXIgdG8uCgpUaGUgZXNjYXBlIGNoYXJhY3RlciBjYW4gbm90IGJlIGVxdWFsIHRvIHRoZSBzZXBhcmF0aW9uIGNoYXJhY3Rlci4KCj1pdGVtIGFsbG93X2xvb3NlX2VzY2FwZXMKCkJ5IGRlZmF1bHQsIHBhcnNpbmcgZmllbGRzIHRoYXQgaGF2ZSBDPGVzY2FwZV9jaGFyPiBjaGFyYWN0ZXJzIHRoYXQKZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBkbyBub3QgbmVlZCB0byBiZSBlc2NhcGVkLCBsaWtlOgoKIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBlc2NhcGVfY2hhciA9PiAiXFwiIH0pOwogJGNzdi0+cGFyc2UgKHFxezEsIm15IGJhclwncyIsYmF6LDQyfSk7Cgp3b3VsZCByZXN1bHQgaW4gYSBwYXJzZSBlcnJvci4gVGhvdWdoIGl0IGlzIHN0aWxsIGJhZCBwcmFjdGljZSB0bwphbGxvdyB0aGlzIGZvcm1hdCwgdGhpcyBvcHRpb24gZW5hYmxlcyB5b3UgdG8gdHJlYXQgYWxsIGVzY2FwZSBjaGFyYWN0ZXIKc2VxdWVuY2VzIGVxdWFsLgoKPWl0ZW0gYmluYXJ5CgpJZiB0aGlzIGF0dHJpYnV0ZSBpcyBUUlVFLCB5b3UgbWF5IHVzZSBiaW5hcnkgY2hhcmFjdGVycyBpbiBxdW90ZWQgZmllbGRzLAppbmNsdWRpbmcgbGluZSBmZWVkcywgY2FycmlhZ2UgcmV0dXJucyBhbmQgTlVMTCBieXRlcy4gKFRoZSBsYXR0ZXIgbXVzdApiZSBlc2NhcGVkIGFzIEM8IjA+LikgQnkgZGVmYXVsdCB0aGlzIGZlYXR1cmUgaXMgb2ZmLgoKPWl0ZW0gdHlwZXMKCkEgc2V0IG9mIGNvbHVtbiB0eXBlczsgdGhpcyBhdHRyaWJ1dGUgaXMgaW1tZWRpYXRlbHkgcGFzc2VkIHRvIHRoZQpJPHR5cGVzPiBtZXRob2QgYmVsb3cuIFlvdSBtdXN0IG5vdCBzZXQgdGhpcyBhdHRyaWJ1dGUgb3RoZXJ3aXNlLApleGNlcHQgZm9yIHVzaW5nIHRoZSBJPHR5cGVzPiBtZXRob2QuIEZvciBkZXRhaWxzIHNlZSB0aGUgZGVzY3JpcHRpb24Kb2YgdGhlIEk8dHlwZXM+IG1ldGhvZCBiZWxvdy4KCj1pdGVtIGFsd2F5c19xdW90ZQoKQnkgZGVmYXVsdCB0aGUgZ2VuZXJhdGVkIGZpZWxkcyBhcmUgcXVvdGVkIG9ubHksIGlmIHRoZXkgbmVlZCB0bywgZm9yCmV4YW1wbGUsIGlmIHRoZXkgY29udGFpbiB0aGUgc2VwYXJhdG9yLiBJZiB5b3Ugc2V0IHRoaXMgYXR0cmlidXRlIHRvCmEgVFJVRSB2YWx1ZSwgdGhlbiBhbGwgZmllbGRzIHdpbGwgYmUgcXVvdGVkLiBUaGlzIGlzIHR5cGljYWxseSBlYXNpZXIKdG8gaGFuZGxlIGluIGV4dGVybmFsIGFwcGxpY2F0aW9ucy4KCj1pdGVtIGtlZXBfbWV0YV9pbmZvCgpCeSBkZWZhdWx0LCB0aGUgcGFyc2luZyBvZiBpbnB1dCBsaW5lcyBpcyBhcyBzaW1wbGUgYW5kIGZhc3QgYXMKcG9zc2libGUuIEhvd2V2ZXIsIHNvbWUgcGFyc2luZyBpbmZvcm1hdGlvbiAtIGxpa2UgcXVvdGF0aW9uIG9mCnRoZSBvcmlnaW5hbCBmaWVsZCAtIGlzIGxvc3QgaW4gdGhhdCBwcm9jZXNzLiBTZXQgdGhpcyBmbGFnIHRvCnRydWUgdG8gYmUgYWJsZSB0byByZXRyaWV2ZSB0aGF0IGluZm9ybWF0aW9uIGFmdGVyIHBhcnNpbmcgd2l0aAp0aGUgbWV0aG9kcyBDPG1ldGFfaW5mbyAoKT4sIEM8aXNfcXVvdGVkICgpPiwgYW5kIEM8aXNfYmluYXJ5ICgpPgpkZXNjcmliZWQgYmVsb3cuICBEZWZhdWx0IGlzIGZhbHNlLgoKPWl0ZW0gdmVyYmF0aW0KClRoaXMgaXMgYSBxdWl0ZSBjb250cm92ZXJzaWFsIGF0dHJpYnV0ZSB0byBzZXQsIGJ1dCBpdCBtYWtlcyBoYXJkCnRoaW5ncyBwb3NzaWJsZS4KClRoZSBiYXNpYyB0aG91Z2h0IGJlaGluZCB0aGlzIGlzIHRvIHRlbGwgdGhlIHBhcnNlciB0aGF0IHRoZSBub3JtYWxseQpzcGVjaWFsIGNoYXJhY3RlcnMgbmV3bGluZSAoTkwpIGFuZCBDYXJyaWFnZSBSZXR1cm4gKENSKSB3aWxsIG5vdCBiZQpzcGVjaWFsIHdoZW4gdGhpcyBmbGFnIGlzIHNldCwgYW5kIGJlIGRlYWx0IHdpdGggYXMgYmVpbmcgb3JkaW5hcnkKYmluYXJ5IGNoYXJhY3RlcnMuIFRoaXMgd2lsbCBlYXNlIHdvcmtpbmcgd2l0aCBkYXRhIHdpdGggZW1iZWRkZWQKbmV3bGluZXMuCgpXaGVuIEM8dmVyYmF0aW0+IGlzIHVzZWQgd2l0aCBDPGdldGxpbmUgKCk+LCBnZXRsaW5lCmF1dG8tY2hvbXAncyBldmVyeSBsaW5lLgoKSW1hZ2luZSBhIGZpbGUgZm9ybWF0IGxpa2UKCiAgTV5eSGFuc15KYW5zc2VuXktsYXMgMlxuMkFeSmFeMTEtMDYtMjAwNyNcclxuCgp3aGVyZSwgdGhlIGxpbmUgZW5kaW5nIGlzIGEgdmVyeSBzcGVjaWZpYyAiI1xyXG4iLCBhbmQgdGhlIHNlcF9jaGFyCmlzIGEgXiAoY2FyZXQpLiBOb25lIG9mIHRoZSBmaWVsZHMgaXMgcXVvdGVkLCBidXQgZW1iZWRkZWQgYmluYXJ5CmRhdGEgaXMgbGlrZWx5IHRvIGJlIHByZXNlbnQuIFdpdGggdGhlIHNwZWNpZmljIGxpbmUgZW5kaW5nLCB0aGF0CnNob3VsZG4ndCBiZSB0b28gaGFyZCB0byBkZXRlY3QuCgpCeSBkZWZhdWx0LCBUZXh0OjpDU1YnIHBhcnNlIGZ1bmN0aW9uIGhvd2V2ZXIgaXMgaW5zdHJ1Y3RlZCB0byBvbmx5Cmtub3cgYWJvdXQgIlxuIiBhbmQgIlxyIiB0byBiZSBsZWdhbCBsaW5lIGVuZGluZ3MsIGFuZCBzbyBoYXMgdG8gZGVhbAp3aXRoIHRoZSBlbWJlZGRlZCBuZXdsaW5lIGFzIGEgcmVhbCBlbmQtb2YtbGluZSwgc28gaXQgY2FuIHNjYW4gdGhlIG5leHQKbGluZSBpZiBiaW5hcnkgaXMgdHJ1ZSwgYW5kIHRoZSBuZXdsaW5lIGlzIGluc2lkZSBhIHF1b3RlZCBmaWVsZC4KV2l0aCB0aGlzIGF0dHJpYnV0ZSBob3dldmVyLCB3ZSBjYW4gdGVsbCBwYXJzZSAoKSB0byBwYXJzZSB0aGUgbGluZQphcyBpZiBcbiBpcyBqdXN0IG5vdGhpbmcgbW9yZSB0aGFuIGEgYmluYXJ5IGNoYXJhY3Rlci4KCkZvciBwYXJzZSAoKSB0aGlzIG1lYW5zIHRoYXQgdGhlIHBhcnNlciBoYXMgbm8gaWRlYSBhYm91dCBsaW5lIGVuZGluZwphbnltb3JlLCBhbmQgZ2V0bGluZSAoKSBjaG9tcHMgbGluZSBlbmRpbmdzIG9uIHJlYWRpbmcuCgo9YmFjawoKVG8gc3VtIGl0IHVwLAoKICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoKTsKCmlzIGVxdWl2YWxlbnQgdG8KCiAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsKICAgICBxdW90ZV9jaGFyICAgICAgICAgID0+ICciJywKICAgICBlc2NhcGVfY2hhciAgICAgICAgID0+ICciJywKICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICcsJywKICAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMCwKICAgICBiaW5hcnkgICAgICAgICAgICAgID0+IDAsCiAgICAga2VlcF9tZXRhX2luZm8gICAgICA9PiAwLAogICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICBhbGxvd19sb29zZV9lc2NhcGVzID0+IDAsCiAgICAgYWxsb3dfd2hpdGVzcGFjZSAgICA9PiAwLAogICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICB2ZXJiYXRpbSAgICAgICAgICAgID0+IDAsCiAgICAgfSk7CgpGb3IgYWxsIG9mIHRoZSBhYm92ZSBtZW50aW9uZWQgZmxhZ3MsIHRoZXJlIGlzIGFuIGFjY2Vzc29yIG1ldGhvZAphdmFpbGFibGUgd2hlcmUgeW91IGNhbiBpbnF1aXJlIGZvciB0aGUgY3VycmVudCB2YWx1ZSwgb3IgY2hhbmdlCnRoZSB2YWx1ZQoKIG15ICRxdW90ZSA9ICRjc3YtPnF1b3RlX2NoYXI7CiAkY3N2LT5iaW5hcnkgKDEpOwoKSXQgaXMgdW53aXNlIHRvIGNoYW5nZSB0aGVzZSBzZXR0aW5ncyBoYWxmd2F5IHRocm91Z2ggd3JpdGluZyBDU1YKZGF0YSB0byBhIHN0cmVhbS4gSWYgaG93ZXZlciwgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IHN0cmVhbSB1c2luZwp0aGUgYXZhaWxhYmxlIENTViBvYmplY3QsIHRoZXJlIGlzIG5vIGhhcm0gaW4gY2hhbmdpbmcgdGhlbS4KCklmIHRoZSBDPG5ldyAoKT4gY29uc3RydWN0b3IgY2FsbCBmYWlscywgaXQgcmV0dXJucyBDPHVuZGVmPiwgYW5kIG1ha2VzCnRoZSBmYWlsIHJlYXNvbiBhdmFpbGFibGUgdGhyb3VnaCB0aGUgQzxlcnJvcl9kaWFnICgpPiBtZXRob2QuCgogJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGVjc19jaGFyID0+IDEgfSkgb3IKICAgICBkaWUgVGV4dDo6Q1NWLT5lcnJvcl9kaWFnICgpOwoKQzxlcnJvcl9kaWFnICgpPiB3aWxsIHJldHVybiBhIHN0cmluZyBsaWtlCgogIlVua25vd24gYXR0cmlidXRlICdlY3NfY2hhciciCgo9aGVhZDIgY29tYmluZQoKICRzdGF0dXMgPSAkY3N2LT5jb21iaW5lIChAY29sdW1ucyk7CgpUaGlzIG9iamVjdCBmdW5jdGlvbiBjb25zdHJ1Y3RzIGEgQ1NWIHN0cmluZyBmcm9tIHRoZSBhcmd1bWVudHMsIHJldHVybmluZwpzdWNjZXNzIG9yIGZhaWx1cmUuICBGYWlsdXJlIGNhbiByZXN1bHQgZnJvbSBsYWNrIG9mIGFyZ3VtZW50cyBvciBhbiBhcmd1bWVudApjb250YWluaW5nIGFuIGludmFsaWQgY2hhcmFjdGVyLiAgVXBvbiBzdWNjZXNzLCBDPHN0cmluZyAoKT4gY2FuIGJlIGNhbGxlZCB0bwpyZXRyaWV2ZSB0aGUgcmVzdWx0YW50IENTViBzdHJpbmcuICBVcG9uIGZhaWx1cmUsIHRoZSB2YWx1ZSByZXR1cm5lZCBieQpDPHN0cmluZyAoKT4gaXMgdW5kZWZpbmVkIGFuZCBDPGVycm9yX2lucHV0ICgpPiBjYW4gYmUgY2FsbGVkIHRvIHJldHJpZXZlIGFuCmludmFsaWQgYXJndW1lbnQuCgo9aGVhZDIgcHJpbnQKCiAkc3RhdHVzID0gJGNzdi0+cHJpbnQgKCRpbywgJGNvbHJlZik7CgpTaW1pbGFyIHRvIGNvbWJpbmUsIGJ1dCBpdCBleHBlY3RzIGFuIGFycmF5IHJlZiBhcyBpbnB1dCAobm90IGFuIGFycmF5ISkKYW5kIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIG5vdCByZWFsbHkgY3JlYXRlZCwgYnV0IGltbWVkaWF0ZWx5IHdyaXR0ZW4KdG8gdGhlIEk8JGlvPiBvYmplY3QsIHR5cGljYWxseSBhbiBJTyBoYW5kbGUgb3IgYW55IG90aGVyIG9iamVjdCB0aGF0Cm9mZmVycyBhIEk8cHJpbnQ+IG1ldGhvZC4gTm90ZSwgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIGZvbGxvd2luZyBpcyB3cm9uZzoKCiBvcGVuIEZJTEUsICI+IiwgIndoYXRldmVyIjsKICRzdGF0dXMgPSAkY3N2LT5wcmludCAoXCpGSUxFLCAkY29scmVmKTsKClRoZSBnbG9iIEM8XCpGSUxFPiBpcyBub3QgYW4gb2JqZWN0LCB0aHVzIGl0IGRvZXNuJ3QgaGF2ZSBhIHByaW50Cm1ldGhvZC4gVGhlIHNvbHV0aW9uIGlzIHRvIHVzZSBhbiBJTzo6RmlsZSBvYmplY3Qgb3IgdG8gaGlkZSB0aGUKZ2xvYiBiZWhpbmQgYW4gSU86OldyYXAgb2JqZWN0LiBTZWUgTDxJTzo6RmlsZSgzKT4gYW5kIEw8SU86OldyYXAoMyk+CmZvciBkZXRhaWxzLgoKRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgdGhlIHByaW50IG1ldGhvZCBkb2Vzbid0IGNyZWF0ZSBhIHJlc3VsdCBzdHJpbmcuCkluIHBhcnRpY3VsYXIgdGhlIEk8JGNzdi1FPGd0PnN0cmluZyAoKT4sIEk8JGNzdi1FPGd0PnN0YXR1cyAoKT4sCkk8JGNzdi0+ZmllbGRzICgpPiBhbmQgSTwkY3N2LUU8Z3Q+ZXJyb3JfaW5wdXQgKCk+IG1ldGhvZHMgYXJlIG1lYW5pbmdsZXNzCmFmdGVyIGV4ZWN1dGluZyB0aGlzIG1ldGhvZC4KCj1oZWFkMiBzdHJpbmcKCiAkbGluZSA9ICRjc3YtPnN0cmluZyAoKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIGlucHV0IHRvIEM8cGFyc2UgKCk+IG9yIHRoZSByZXN1bHRhbnQgQ1NWCnN0cmluZyBvZiBDPGNvbWJpbmUgKCk+LCB3aGljaGV2ZXIgd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgoKPWhlYWQyIHBhcnNlCgogJHN0YXR1cyA9ICRjc3YtPnBhcnNlICgkbGluZSk7CgpUaGlzIG9iamVjdCBmdW5jdGlvbiBkZWNvbXBvc2VzIGEgQ1NWIHN0cmluZyBpbnRvIGZpZWxkcywgcmV0dXJuaW5nCnN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEZhaWx1cmUgY2FuIHJlc3VsdCBmcm9tIGEgbGFjayBvZiBhcmd1bWVudCBvciB0aGUKZ2l2ZW4gQ1NWIHN0cmluZyBpcyBpbXByb3Blcmx5IGZvcm1hdHRlZC4gIFVwb24gc3VjY2VzcywgQzxmaWVsZHMgKCk+IGNhbgpiZSBjYWxsZWQgdG8gcmV0cmlldmUgdGhlIGRlY29tcG9zZWQgZmllbGRzIC4gIFVwb24gZmFpbHVyZSwgdGhlIHZhbHVlCnJldHVybmVkIGJ5IEM8ZmllbGRzICgpPiBpcyB1bmRlZmluZWQgYW5kIEM8ZXJyb3JfaW5wdXQgKCk+IGNhbiBiZSBjYWxsZWQKdG8gcmV0cmlldmUgdGhlIGludmFsaWQgYXJndW1lbnQuCgpZb3UgbWF5IHVzZSB0aGUgSTx0eXBlcyAoKT4gbWV0aG9kIGZvciBzZXR0aW5nIGNvbHVtbiB0eXBlcy4gU2VlIHRoZQpkZXNjcmlwdGlvbiBiZWxvdy4KCj1oZWFkMiBnZXRsaW5lCgogJGNvbHJlZiA9ICRjc3YtPmdldGxpbmUgKCRpbyk7CgpUaGlzIGlzIHRoZSBjb3VudGVycGFydCB0byBwcmludCwgbGlrZSBwYXJzZSBpcyB0aGUgY291bnRlcnBhcnQgdG8KY29tYmluZTogSXQgcmVhZHMgYSByb3cgZnJvbSB0aGUgSU8gb2JqZWN0ICRpbyB1c2luZyAkaW8tPmdldGxpbmUgKCkKYW5kIHBhcnNlcyB0aGlzIHJvdyBpbnRvIGFuIGFycmF5IHJlZi4gVGhpcyBhcnJheSByZWYgaXMgcmV0dXJuZWQKYnkgdGhlIGZ1bmN0aW9uIG9yIHVuZGVmIGZvciBmYWlsdXJlLgoKV2hlbiBmaWVsZHMgYXJlIGJvdW5kIHdpdGggQzxiaW5kX2NvbHVtbnMgKCk+LCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEKcmVmZXJlbmNlIHRvIGFuIGVtcHR5IGxpc3QuCgpUaGUgSTwkY3N2LUU8Z3Q+c3RyaW5nICgpPiwgSTwkY3N2LUU8Z3Q+ZmllbGRzICgpPiBhbmQgSTwkY3N2LUU8Z3Q+c3RhdHVzICgpPgptZXRob2RzIGFyZSBtZWFuaW5nbGVzcywgYWdhaW4uCgo9aGVhZDIgZ2V0bGluZV9ocgoKVGhlIEM8Z2V0bGluZV9ociAoKT4gYW5kIEM8Y29sdW1uX25hbWVzICgpPiBtZXRob2RzIHdvcmsgdG9nZXRoZXIgdG8gYWxsb3cKeW91IHRvIGhhdmUgcm93cyByZXR1cm5lZCBhcyBoYXNocmVmcy4gWW91IG11c3QgY2FsbCBDPGNvbHVtbl9uYW1lcyAoKT4KZmlyc3QgdG8gZGVjbGFyZSB5b3VyIGNvbHVtbiBuYW1lcy4gCgogJGNzdi0+Y29sdW1uX25hbWVzIChxdyggY29kZSBuYW1lIHByaWNlIGRlc2NyaXB0aW9uICkpOwogJGhyID0gJGNzdi0+Z2V0bGluZV9ociAoJGlvKTsKIHByaW50ICJQcmljZSBmb3IgJGhyLT57bmFtZX0gaXMgJGhyLT57cHJpY2V9IEVVUlxuIjsKCkM8Z2V0bGluZV9ociAoKT4gd2lsbCBjcm9hayBpZiBjYWxsZWQgYmVmb3JlIEM8Y29sdW1uX25hbWVzICgpPi4KCj1oZWFkMiBjb2x1bW5fbmFtZXMKClNldCB0aGUga2V5cyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgQzxnZXRsaW5lX2hyICgpPiBjYWxscy4gSWYgbm8ga2V5cwooY29sdW1uIG5hbWVzKSBhcmUgcGFzc2VkLCBpdCdsbCByZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZy4KCkM8Y29sdW1uX25hbWVzICgpPiBhY2NlcHRzIGEgbGlzdCBvZiBzY2FsYXJzICh0aGUgY29sdW1uIG5hbWVzKSBvciBhCnNpbmdsZSBhcnJheV9yZWYsIHNvIHlvdSBjYW4gcGFzcyBDPGdldGxpbmUgKCk+CgogICRjc3YtPmNvbHVtbl9uYW1lcyAoJGNzdi0+Z2V0bGluZSAoJGlvKSk7CgpDPGNvbHVtbl9uYW1lcyAoKT4gY3JvYWtzIG9uIGludmFsaWQgYXJndW1lbnRzLgoKPWhlYWQyIGJpbmRfY29sdW1ucwoKVGFrZXMgYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gc2NhbGFycyB0byBzdG9yZSB0aGUgZmllbGRzIGZldGNoZWQKQzxnZXRsaW5lICgpPiBpbi4gV2hlbiB5b3UgZG9uJ3QgcGFzcyBlbm91Z2ggcmVmZXJlbmNlcyB0byBzdG9yZSB0aGUKZmV0Y2hlZCBmaWVsZHMgaW4sIEM8Z2V0bGluZSAoKT4gd2lsbCBmYWlsLiBJZiB5b3UgcGFzcyBtb3JlIHRoYW4gdGhlcmUgYXJlCmZpZWxkcyB0byByZXR1cm4sIHRoZSByZW1haW5pbmcgcmVmZXJlbmNlcyBhcmUgbGVmdCB1bnRvdWNoZWQuCgogICRjc3YtPmJpbmRfY29sdW1ucyAoXCRjb2RlLCBcJG5hbWUsIFwkcHJpY2UsIFwkZGVzY3JpcHRpb24pOwogIHdoaWxlICgkY3N2LT5nZXRsaW5lICgpKSB7CiAgICAgIHByaW50ICJUaGUgcHJpY2Ugb2YgYSAkbmFtZSBpcyBceHsyMGFjfSAkcHJpY2VcbiI7CiAgICAgIH0KCj1oZWFkMiBlb2YKCiAkZW9mID0gJGNzdi0+ZW9mICgpOwoKSWYgQzxwYXJzZSAoKT4gb3IgQzxnZXRsaW5lICgpPiB3YXMgdXNlZCB3aXRoIGFuIElPIHN0cmVhbSwgdGhpcwptZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZSAoMSkgaWYgdGhlIGxhc3QgY2FsbCBoaXQgZW5kIG9mIGZpbGUsIG90aGVyd2lzZQppdCB3aWxsIHJldHVybiBmYWxzZSAoJycpLiBUaGlzIGlzIHVzZWZ1bCB0byBzZWUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgphIGZhaWx1cmUgYW5kIGVuZCBvZiBmaWxlLgoKPWhlYWQyIHR5cGVzCgogJGNzdi0+dHlwZXMgKFxAdHJlZik7CgpUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGZvcmNlIHRoYXQgY29sdW1ucyBhcmUgb2YgYSBnaXZlbiB0eXBlLiBGb3IKZXhhbXBsZSwgaWYgeW91IGhhdmUgYW4gaW50ZWdlciBjb2x1bW4sIHR3byBkb3VibGUgY29sdW1ucyBhbmQgYQpzdHJpbmcgY29sdW1uLCB0aGVuIHlvdSBtaWdodCBkbyBhCgogJGNzdi0+dHlwZXMgKFtUZXh0OjpDU1Y6OklWICgpLAogICAgICAgICAgICAgICBUZXh0OjpDU1Y6Ok5WICgpLAogICAgICAgICAgICAgICBUZXh0OjpDU1Y6Ok5WICgpLAogICAgICAgICAgICAgICBUZXh0OjpDU1Y6OlBWICgpXSk7CgpDb2x1bW4gdHlwZXMgYXJlIHVzZWQgb25seSBmb3IgZGVjb2RpbmcgY29sdW1ucywgaW4gb3RoZXIgd29yZHMKYnkgdGhlIEk8cGFyc2UgKCk+IGFuZCBJPGdldGxpbmUgKCk+IG1ldGhvZHMuCgpZb3UgY2FuIHVuc2V0IGNvbHVtbiB0eXBlcyBieSBkb2luZyBhCgogJGNzdi0+dHlwZXMgKHVuZGVmKTsKCm9yIGZldGNoIHRoZSBjdXJyZW50IHR5cGUgc2V0dGluZ3Mgd2l0aAoKICR0eXBlcyA9ICRjc3YtPnR5cGVzICgpOwoKPW92ZXIgNAoKPWl0ZW0gSVYKClNldCBmaWVsZCB0eXBlIHRvIGludGVnZXIuCgo9aXRlbSBOVgoKU2V0IGZpZWxkIHR5cGUgdG8gbnVtZXJpYy9mbG9hdC4KCj1pdGVtIFBWCgpTZXQgZmllbGQgdHlwZSB0byBzdHJpbmcuCgo9YmFjawoKPWhlYWQyIGZpZWxkcwoKIEBjb2x1bW5zID0gJGNzdi0+ZmllbGRzICgpOwoKVGhpcyBvYmplY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5wdXQgdG8gQzxjb21iaW5lICgpPiBvciB0aGUgcmVzdWx0YW50CmRlY29tcG9zZWQgZmllbGRzIG9mIEM8cGFyc2UgKCk+LCB3aGljaGV2ZXIgd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgoKPWhlYWQyIG1ldGFfaW5mbwoKIEBmbGFncyA9ICRjc3YtPm1ldGFfaW5mbyAoKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIGZsYWdzIG9mIHRoZSBpbnB1dCB0byBDPGNvbWJpbmUgKCk+IG9yCnRoZSBmbGFncyBvZiB0aGUgcmVzdWx0YW50IGRlY29tcG9zZWQgZmllbGRzIG9mIEM8cGFyc2UgKCk+LCB3aGljaGV2ZXIKd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgoKRm9yIGVhY2ggZmllbGQsIGEgbWV0YV9pbmZvIGZpZWxkIHdpbGwgaG9sZCBmbGFncyB0aGF0IHRlbGwgc29tZXRoaW5nIGFib3V0CnRoZSBmaWVsZCByZXR1cm5lZCBieSB0aGUgQzxmaWVsZHMgKCk+IG1ldGhvZCBvciBwYXNzZWQgdG8gdGhlIEM8Y29tYmluZSAoKT4KbWV0aG9kLiBUaGUgZmxhZ3MgYXJlIGJpdHdpc2Utb3InZCBsaWtlOgoKPW92ZXIgNAoKPWl0ZW0gMHgwMDAxCgpUaGUgZmllbGQgd2FzIHF1b3RlZC4KCj1pdGVtIDB4MDAwMgoKVGhlIGZpZWxkIHdhcyBiaW5hcnkuCgo9YmFjawoKU2VlIHRoZSBDPGlzXyoqKiAoKT4gbWV0aG9kcyBiZWxvdy4KCj1oZWFkMiBpc19xdW90ZWQKCiAgbXkgJHF1b3RlZCA9ICRjc3YtPmlzX3F1b3RlZCAoJGNvbHVtbl9pZHgpOwoKV2hlcmUgQzwkY29sdW1uX2lkeD4gaXMgdGhlICh6ZXJvLWJhc2VkKSBpbmRleCBvZiB0aGUgY29sdW1uIGluIHRoZQpsYXN0IHJlc3VsdCBvZiBDPHBhcnNlICgpPi4KClRoaXMgcmV0dXJucyBhIHRydWUgdmFsdWUgaWYgdGhlIGRhdGEgaW4gdGhlIGluZGljYXRlZCBjb2x1bW4gd2FzCmVuY2xvc2VkIGluIEM8cXVvdGVfY2hhcj4gcXVvdGVzLiBUaGlzIG1pZ2h0IGJlIGltcG9ydGFudCBmb3IgZGF0YQp3aGVyZSBDPCwyMDA3MDEwOCw+IGlzIHRvIGJlIHRyZWF0ZWQgYXMgYSBudW1lcmljIHZhbHVlLCBhbmQgd2hlcmUKQzwsIjIwMDcwMTA4Iiw+IGlzIGV4cGxpY2l0bHkgbWFya2VkIGFzIGNoYXJhY3RlciBzdHJpbmcgZGF0YS4KCj1oZWFkMiBpc19iaW5hcnkKCiAgbXkgJGJpbmFyeSA9ICRjc3YtPmlzX2JpbmFyeSAoJGNvbHVtbl9pZHgpOwoKV2hlcmUgQzwkY29sdW1uX2lkeD4gaXMgdGhlICh6ZXJvLWJhc2VkKSBpbmRleCBvZiB0aGUgY29sdW1uIGluIHRoZQpsYXN0IHJlc3VsdCBvZiBDPHBhcnNlICgpPi4KClRoaXMgcmV0dXJucyBhIHRydWUgdmFsdWUgaWYgdGhlIGRhdGEgaW4gdGhlIGluZGljYXRlZCBjb2x1bW4KY29udGFpbmVkIGFueSBieXRlIGluIHRoZSByYW5nZSBbXHgwMC1ceDA4LFx4MTAtXHgxRixceDdGLVx4RkZdCgo9aGVhZDIgc3RhdHVzCgogJHN0YXR1cyA9ICRjc3YtPnN0YXR1cyAoKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIHJldHVybnMgc3VjY2VzcyAob3IgZmFpbHVyZSkgb2YgQzxjb21iaW5lICgpPiBvcgpDPHBhcnNlICgpPiwgd2hpY2hldmVyIHdhcyBjYWxsZWQgbW9yZSByZWNlbnRseS4KCj1oZWFkMiBlcnJvcl9pbnB1dAoKICRiYWRfYXJndW1lbnQgPSAkY3N2LT5lcnJvcl9pbnB1dCAoKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIGVycm9uZW91cyBhcmd1bWVudCAoaWYgaXQgZXhpc3RzKSBvZgpDPGNvbWJpbmUgKCk+IG9yIEM8cGFyc2UgKCk+LCB3aGljaGV2ZXIgd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgoKPWhlYWQyIGVycm9yX2RpYWcKCiAkY3N2LT5lcnJvcl9kaWFnICgpOwogJGVycm9yX2NvZGUgICA9IDAgICsgJGNzdi0+ZXJyb3JfZGlhZyAoKTsKICRlcnJvcl9zdHIgICAgPSAiIiAuICRjc3YtPmVycm9yX2RpYWcgKCk7CiAoJGNkZSwgJHN0ciwgJHBvcykgPSAkY3N2LT5lcnJvcl9kaWFnICgpOwoKSWYgKGFuZCBvbmx5IGlmKSBhbiBlcnJvciBvY2N1cmVkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRpYWdub3N0aWNzCm9mIHRoYXQgZXJyb3IuCgpJZiBjYWxsZWQgaW4gdm9pZCBjb250ZXh0LCBpdCB3aWxsIHByaW50IHRoZSBpbnRlcm5hbCBlcnJvciBjb2RlIGFuZCB0aGUKYXNzb2NpYXRlZCBlcnJvciBtZXNzYWdlIHRvIFNUREVSUi4KCklmIGNhbGxlZCBpbiBsaXN0IGNvbnRleHQsIGl0IHdpbGwgcmV0dXJuIHRoZSBlcnJvciBjb2RlIGFuZCB0aGUgZXJyb3IKbWVzc2FnZSBpbiB0aGF0IG9yZGVyLiBJZiB0aGUgbGFzdCBlcnJvciB3YXMgZnJvbSBwYXJzaW5nLCB0aGUgdGhpcmQKdmFsdWUgcmV0dXJuZWQgaXMgdGhlIGJlc3QgZ3Vlc3MgYXQgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgbGluZSB0aGF0IHdhcwpiZWluZyBwYXJzZWQuIEl0J3MgdmFsdWUgaXMgMS1iYXNlZC4KCk5vdGU6IEM8JHBvcz4gcmV0dXJuZWQgYnkgdGhlIGJhY2tlbmQgVGV4dDo6Q1NWX1BQIGRvZXMgbm90IHNob3cKdGhlIGVycm9yIHBvaW50IGluIG1hbnkgY2FzZXMgKHNlZSB0byB0aGUgYmVsb3cgbGluZSkuCkl0IGlzIGZvciBjb25zY2llbmNlJ3Mgc2FrZSBpbiB1c2luZyBUZXh0OjpDU1ZfUFAuCgpJZiBjYWxsZWQgaW4gc2NhbGFyIGNvbnRleHQsIGl0IHdpbGwgcmV0dXJuIHRoZSBkaWFnbm9zdGljcyBpbiBhIHNpbmdsZQpzY2FsYXIsIGEtbGEgJCEuIEl0IHdpbGwgY29udGFpbiB0aGUgZXJyb3IgY29kZSBpbiBudW1lcmljIGNvbnRleHQsIGFuZAp0aGUgZGlhZ25vc3RpY3MgbWVzc2FnZSBpbiBzdHJpbmcgY29udGV4dC4KCkRlcGVuZGluZyBvbiB0aGUgdXNlZCB3b3JrZXIgbW9kdWxlLCByZXR1cm5lZCBkaWFnbm9zdGljcyBpcyBkaWZmZmVyZW50LgoKVGV4dDo6Q1NWX1hTIHBhcnNlcyBjc3Ygc3RyaW5ncyBieSBkaXZpZGluZyBvbmUgY2hhcmFjdGVyIHdoaWxlIFRleHQ6OkNTVl9QUApieSB1c2luZyB0aGUgcmVndWxhciBleHByZXNzaW9ucy4gVGhhdCBkaWZmZXJlbmNlIG1ha2VzIHRoZSBkaWZmZXJlbnQgY2F1c2UKb2YgdGhlIGZhaWx1cmUuCgo9aGVhZDIgU2V0RGlhZwoKICRjc3YtPlNldERpYWcgKDApOwoKVXNlIHRvIHJlc2V0IHRoZSBkaWFnbm9zdGljcyBpZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBlcnJvcnMuCgo9aGVhZDIgU29tZSBtZXRob2RzIGFyZSBUZXh0OjpDU1Ygb25seS4KCj1vdmVyCgo9aXRlbSBiYWNrZW5kCgpSZXR1cm5zIHRoZSBiYWNrZW5kIG1vZHVsZSBuYW1lIGNhbGxlZCBieSBUZXh0OjpDU1YuCkM8bW9kdWxlPiBpcyBhbiBhbGlhcy4KCgo9aXRlbSBpc194cwoKUmV0dXJucyB0cnVlIHZhbHVlIGlmIFRleHQ6OkNTViBvciB0aGUgb2JqZWN0IHVzZXMgWFMgbW9kdWxlIGFzIHdvcmtlci4KCj1pdGVtIGlzX3BwCgpSZXR1cm5zIHRydWUgdmFsdWUgaWYgVGV4dDo6Q1NWIG9yIHRoZSBvYmplY3QgdXNlcyBwdXJlLVBlcmwgbW9kdWxlIGFzIHdvcmtlci4KCgo9YmFjawoKCj1oZWFkMSBESUFHTk9TVElDUwoKSWYgYW4gZXJyb3Igb2NjdXJlZCwgJGNzdi0+ZXJyb3JfZGlhZyAoKSBjYW4gYmUgdXNlZCB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbgpvbiB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUuIE5vdGUgdGhhdCBmb3Igc3BlZWQgcmVhc29ucywgdGhlIGludGVybmFsIHZhbHVlCmlzIG5ldmVyIGNsZWFyZWQgb24gc3VjY2Vzcywgc28gdXNpbmcgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGVycm9yX2RpYWcgKCkgaW4Kbm9ybWFsIGNhc2VzIC0gd2hlbiBubyBlcnJvciBvY2N1cmVkIC0gbWF5IGNhdXNlIHVuZXhwZWN0ZWQgcmVzdWx0cy4KClRoaXMgZnVuY3Rpb24gY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIHVzZWQgbW9kdWxlIChYUyBvciBQdXJlUGVybCkuCgpTZWUgdG8gTDxUZXh0OjpDU1ZfWFMvRElBR05PU1RJQ1M+IGFuZCBMPFRleHQ6OkNTVl9QUC9ESUFHTk9TVElDUz4uCgoKCj1oZWFkMiBISVNUT1JZIEFORCBXT1JLRVIgTU9EVUxFUwoKVGhpcyBtb2R1bGUsIEw8VGV4dDo6Q1NWPiB3YXMgZmlyc3RseSB3cml0dGVuIGJ5IEFsYW4gQ2l0dGVybWFuIHdoaWNoIGNvdWxkIGRlYWwgd2l0aApCPG9ubHkgYXNjaWkgY2hhcmFjdGVycz4uIFRoZW4sIEpvY2hlbiBXaWVkbWFubiB3cm90ZSBMPFRleHQ6OkNTVl9YUz4gd2hpY2ggaGFzCnRoZSBCPGJpbmFyeSBtb2RlPi4gVGhpcyBYUyB2ZXJzaW9uIGlzIG1haW50YWluZWQgYnkgSC5NZXJpam4gQnJhbmQgYW5kIEw8VGV4dDo6Q1NWX1BQPgp3cml0dGVuIGJ5IE1ha2FtYWthIHdhcyBwdXJlLVBlcmwgdmVyc2lvbiBvZiBUZXh0OjpDU1ZfWFMuCgpOb3csIFRleHQ6OkNTViB3YXMgcmV3cml0dGVuIGJ5IE1ha2FtYWthIGFuZCBiZWNvbWUgYSB3cmFwcGVyIHRvIFRleHQ6OkNTVl9YUyBvciBUZXh0OjpDU1ZfUFAuClRleHQ6OkNTVl9QUCB3aWxsIGJlIGJ1bmRsZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uCgpXaGVuIHlvdSB1c2UgVGV4dDo6Q1NWLCBpdCBjYWxscyBhIGJhY2tlbmQgd29ya2VyIG1vZHVsZSAtIEw8VGV4dDo6Q1NWX1hTPiBvciBMPFRleHQ6OkNTVl9QUD4uCkJ5IGRlZmF1bHQsIFRleHQ6OkNTViB0cmllcyB0byB1c2UgVGV4dDo6Q1NWX1hTIHdoaWNoIG11c3QgYmUgY29tcGxpZWQgYW5kIGluc3RhbGxlZCBwcm9wZXJseS4KSWYgdGhpcyBjYWxsIGlzIGZhaWwsIFRleHQ6OkNTViB1c2VzIEw8VGV4dDo6Q1NWX1BQPi4KClRoZSByZXF1aXJlZCBUZXh0OjpDU1ZfWFMgdmVyc2lvbiBpcyBJPDAuNDE+IGluIFRleHQ6OkNTViB2ZXJzaW9uIDEuMDMuCgpJZiB5b3Ugc2V0IGFuIGVudmlvcm5tZW50IHZhcmlhYmxlIEM8UEVSTF9URVhUX0NTVj4sIFRoZSBjYWxsaW5nIGFjdGlvbiB3aWxsIGJlIGNoYW5nZWQuCgo9b3ZlcgoKPWl0ZW0gUEVSTF9URVhUX0NTViA9IDAKCj1pdGVtIFBFUkxfVEVYVF9DU1YgPSAnVGV4dDo6Q1NWX1BQJwoKQWx3YXlzIHVzZSBUZXh0OjpDU1ZfUFAKCj1pdGVtIFBFUkxfVEVYVF9DU1YgPSAxCgo9aXRlbSBQRVJMX1RFWFRfQ1NWID0gJ1RleHQ6OkNTVl9YUyxUZXh0OjpDU1ZfUFAnCgooVGhlIGRlZmF1bHQpIFVzZSBjb21waWxlZCBUZXh0OjpDU1ZfWFMgaWYgaXQgaXMgcHJvcGVybHkgY29tcGlsZWQgJiBpbnN0YWxsZWQsCm90aGVyd2lzZSB1c2UgVGV4dDo6Q1NWX1BQCgo9aXRlbSBQRVJMX1RFWFRfQ1NWID0gMgoKPWl0ZW0gUEVSTF9URVhUX0NTViA9ICdUZXh0OjpDU1ZfWFMnCgpBbHdheXMgdXNlIGNvbXBpbGVkIFRleHQ6OkNTVl9YUywgZGllIGlmIGl0IGlzbid0IHByb3Blcmx5IGNvbXBpbGVkICYgaW5zdGFsbGVkLgoKPWJhY2sKClRoZXNlIGlkZWFzIGNvbWUgZnJvbSBMPERCSTo6UHVyZVBlcmw+IG1lY2hhbmlzbS4KCmV4YW1wbGU6CgogIEJFR0lOIHsgJEVOVntQRVJMX1RFWFRfQ1NWfSA9IDAgfQogIHVzZSBUZXh0OjpDU1Y7ICMgYWx3YXlzIHVzZXMgVGV4dDo6Q1NWX1BQCgoKSW4gZnV0dXJlLCBpdCBtYXkgYmUgYWJsZSB0byBzcGVjaWZ5IGFub3RoZXIgbW9kdWxlLgoKPWhlYWQxIFRPRE8KCj1vdmVyCgo9aXRlbSBXcmFwcGVyIG1lY2hhbmlzbQoKQ3VycmVudGx5IHRoZSB3cmFwcGVyIG1lY2hhbmlzbSBpcyB0byBjaGFuZ2Ugc3ltYm9saWMgdGFibGUgZm9yIHNwZWVkLgoKIGZvciBteSAkbWV0aG9kIChAUHVibGljTWV0aG9kcykgewogICAgICp7IlRleHQ6OkNTVjo6JG1ldGhvZCJ9ID0gXCZ7IiRjbGFzc1w6OiRtZXRob2QifTsKIH0KCkJ1dCBob3cgYWJvdXQgaXQgLSBjYWxsaW5nIHdvcmtlciBtb2R1bGUgb2JqZWN0PwoKIHN1YiBwYXJzZSB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICAkc2VsZi0+e19XT1JLRVJfT0JKRUNUfS0+cGFyc2UoQF8pOyAjIFhTIG9yIFBQIENTViBvYmplY3QKIH0KCgoKPWl0ZW0gU2ltcGxlIG9wdGlvbgoKICRjc3YgPSBUZXh0OjpDU1YtPnNpbXBsZTsKCmlzIGVxdWl2YWxlbnQgdG8KCiAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsKICAgICBxdW90ZV9jaGFyICAgICAgICAgID0+ICciJywKICAgICBlc2NhcGVfY2hhciAgICAgICAgID0+ICciJywKICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICcsJywKICAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgIGJpbmFyeSAgICAgICAgICAgICAgPT4gMSwKICAgICBhbGxvd19sb29zZV9xdW90ZXMgID0+IDEsCiAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAxLAogICAgIGFsbG93X3doaXRlc3BhY2UgICAgPT4gMSwKICAgICBibGFua19pc191bmRlZiAgICAgID0+IDEsCiB9KTsKCklzIGl0IG5lZWRsZXNzPwoKCj1iYWNrCgpTZWUgdG8gTDxUZXh0OjpDU1ZfWFMvVE9ETz4gYW5kIEw8VGV4dDo6Q1NWX1BQL1RPRE8+LgoKCj1oZWFkMSBTRUUgQUxTTwoKTDxUZXh0OjpDU1ZfUFAoMyk+IGFuZCBMPFRleHQ6OkNTVl9YUygzKT4uCgoKPWhlYWQxIEFVVEhPUlMgYW5kIE1BSU5UQUlORVJTCgpBbGFuIENpdHRlcm1hbiBGPEU8bHQ+YWxhblthdF1tZmdydGwuY29tRTxndD4+IHdyb3RlIHRoZSBvcmlnaW5hbCBQZXJsCm1vZHVsZS4gUGxlYXNlIGRvbid0IHNlbmQgbWFpbCBjb25jZXJuaW5nIFRleHQ6OkNTViB0byBBbGFuLCBhcwpoZSdzIG5vdCBhIHByZXNlbnQgbWFpbnRhaW5lci4KCkpvY2hlbiBXaWVkbWFubiBGPEU8bHQ+am9lW2F0XWlzcHNvZnQuZGVFPGd0Pj4gcmV3cm90ZSB0aGUgZW5jb2RpbmcgYW5kCmRlY29kaW5nIGluIEMgYnkgaW1wbGVtZW50aW5nIGEgc2ltcGxlIGZpbml0ZS1zdGF0ZSBtYWNoaW5lIGFuZCBhZGRlZAp0aGUgdmFyaWFibGUgcXVvdGUsIGVzY2FwZSBhbmQgc2VwYXJhdG9yIGNoYXJhY3RlcnMsIHRoZSBiaW5hcnkgbW9kZQphbmQgdGhlIHByaW50IGFuZCBnZXRsaW5lIG1ldGhvZHMuIFNlZSBDaGFuZ2VMb2cgcmVsZWFzZXMgMC4xMCB0aHJvdWdoCjAuMjMuCgpILk1lcmlqbiBCcmFuZCBGPEU8bHQ+aC5tLmJyYW5kW2F0XXhzNGFsbC5ubEU8Z3Q+PiBjbGVhbmVkIHVwIHRoZSBjb2RlLAphZGRlZCB0aGUgZmllbGQgZmxhZ3MgbWV0aG9kcywgd3JvdGUgdGhlIG1ham9yIHBhcnQgb2YgdGhlIHRlc3Qgc3VpdGUsCmNvbXBsZXRlZCB0aGUgZG9jdW1lbnRhdGlvbiwgZml4ZWQgc29tZSBSVCBidWdzLiBTZWUgQ2hhbmdlTG9nIHJlbGVhc2VzCjAuMjUgYW5kIG9uLgoKTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUsIEU8bHQ+bWFrYW1ha2FbYXRdY3Bhbi5vcmdFPGd0PiB3cm90ZSBUZXh0OjpDU1ZfUFAKd2hpY2ggaXMgdGhlIHB1cmUtUGVybCB2ZXJzaW9uIG9mIFRleHQ6OkNTVl9YUy4KCk5ldyBUZXh0OjpDU1YgKHNpbmNlIDAuOTkpIGlzIG1haW50YWluZWQgYnkgTWFrYW1ha2EuCgoKPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQoKVGV4dDo6Q1NWCgpDb3B5cmlnaHQgKEMpIDE5OTcgQWxhbiBDaXR0ZXJtYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkNvcHlyaWdodCAoQykgMjAwNy0yMDA4IE1ha2FtYWthIEhhbm55YWhhcmFtaXR1LgoKClRleHQ6OkNTVl9QUDoKCkNvcHlyaWdodCAoQykgMjAwNS0yMDA4IE1ha2FtYWthIEhhbm55YWhhcmFtaXR1LgoKClRleHQ6Q1NWX1hTOgoKQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSC5NZXJpam4gQnJhbmQgZm9yIFBST0NVUkEgQi5WLgpDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSBKb2NoZW4gV2llZG1hbm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuClBvcnRpb25zIENvcHlyaWdodCAoQykgMTk5NyBBbGFuIENpdHRlcm1hbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgpUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gCgo9Y3V0Cg==
cGFja2FnZSBUZXh0OjpDU1ZfUFA7CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojCiMgVGV4dDo6Q1NWX1BQIC0gVGV4dDo6Q1NWX1hTIGNvbXBhdGlibGUgcHVyZS1QZXJsIG1vZHVsZQojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnJlcXVpcmUgNS4wMDU7Cgp1c2Ugc3RyaWN0Owp1c2UgdmFycyBxdygkVkVSU0lPTik7CnVzZSBDYXJwICgpOwoKJFZFUlNJT04gPSAnMS4xNCc7CgpzdWIgUFYgIHsgMCB9CnN1YiBJViAgeyAxIH0Kc3ViIE5WICB7IDIgfQoKc3ViIElTX1FVT1RFRCAoKSB7IDB4MDAwMTsgfQpzdWIgSVNfQklOQVJZICgpIHsgMHgwMDAyOyB9CgoKbXkgJEVSUk9SUyA9IHsKICAgICAgICAjIFBQIGFuZCBYUwogICAgICAgIDEwMDAgPT4gIklOSSAtIGNvbnN0cnVjdG9yIGZhaWxlZCIsCiAgICAgICAgMTAwMSA9PiAic2VwX2NoYXIgaXMgZXF1YWwgdG8gcXVvdGVfY2hhciBvciBlc2NhcGVfY2hhciIsCgogICAgICAgIDIwMTAgPT4gIkVDUiAtIFFVTyBjaGFyIGluc2lkZSBxdW90ZXMgZm9sbG93ZWQgYnkgQ1Igbm90IHBhcnQgb2YgRU9MIiwKICAgICAgICAyMDExID0+ICJFQ1IgLSBDaGFyYWN0ZXJzIGFmdGVyIGVuZCBvZiBxdW90ZWQgZmllbGQiLAoKICAgICAgICAyMDIxID0+ICJFSVEgLSBOTCBjaGFyIGluc2lkZSBxdW90ZXMsIGJpbmFyeSBvZmYiLAogICAgICAgIDIwMjIgPT4gIkVJUSAtIENSIGNoYXIgaW5zaWRlIHF1b3RlcywgYmluYXJ5IG9mZiIsCiAgICAgICAgMjAyNSA9PiAiRUlRIC0gTG9vc2UgdW5lc2NhcGVkIGVzY2FwZSIsCiAgICAgICAgMjAyNiA9PiAiRUlRIC0gQmluYXJ5IGNoYXJhY3RlciBpbnNpZGUgcXVvdGVkIGZpZWxkLCBiaW5hcnkgb2ZmIiwKICAgICAgICAyMDI3ID0+ICJFSVEgLSBRdW90ZWQgZmllbGQgbm90IHRlcm1pbmF0ZWQiLAoKICAgICAgICAyMDMwID0+ICJFSUYgLSBOTCBjaGFyIGluc2lkZSB1bnF1b3RlZCB2ZXJiYXRpbSwgYmluYXJ5IG9mZiIsCiAgICAgICAgMjAzMSA9PiAiRUlGIC0gQ1IgY2hhciBpcyBmaXJzdCBjaGFyIG9mIGZpZWxkLCBub3QgcGFydCBvZiBFT0wiLAogICAgICAgIDIwMzIgPT4gIkVJRiAtIENSIGNoYXIgaW5zaWRlIHVucXVvdGVkLCBub3QgcGFydCBvZiBFT0wiLAogICAgICAgIDIwMzQgPT4gIkVJRiAtIExvb3NlIHVuZXNjYXBlZCBxdW90ZSIsCiAgICAgICAgMjAzNyA9PiAiRUlGIC0gQmluYXJ5IGNoYXJhY3RlciBpbiB1bnF1b3RlZCBmaWVsZCwgYmluYXJ5IG9mZiIsCgogICAgICAgIDIxMTAgPT4gIkVDQiAtIEJpbmFyeSBjaGFyYWN0ZXIgaW4gQ29tYmluZSwgYmluYXJ5IG9mZiIsCgogICAgICAgICMgUFAgT25seSBFcnJvcgogICAgICAgIDQwMDIgPT4gIkVJUSAtIFVuZXNjYXBlZCBFU0MgaW4gcXVvdGVkIGZpZWxkIiwKICAgICAgICA0MDAzID0+ICJFSUYgLSBFU0MgQ1IiLAogICAgICAgIDQwMDQgPT4gIkVVRiAtICIsCgogICAgICAgICMgSGFzaC1SZWYgZXJyb3JzCiAgICAgICAgMzAwMSA9PiAiRUhSIC0gVW5zdXBwb3J0ZWQgc3ludGF4IGZvciBjb2x1bW5fbmFtZXMgKCkiLAogICAgICAgIDMwMDIgPT4gIkVIUiAtIGdldGxpbmVfaHIgKCkgY2FsbGVkIGJlZm9yZSBjb2x1bW5fbmFtZXMgKCkiLAogICAgICAgIDMwMDMgPT4gIkVIUiAtIGJpbmRfY29sdW1ucyAoKSBhbmQgY29sdW1uX25hbWVzICgpIGZpZWxkcyBjb3VudCBtaXNtYXRjaCIsCiAgICAgICAgMzAwNCA9PiAiRUhSIC0gYmluZF9jb2x1bW5zICgpIG9ubHkgYWNjZXB0cyByZWZzIHRvIHNjYWxhcnMiLAogICAgICAgIDMwMDYgPT4gIkVIUiAtIGJpbmRfY29sdW1ucyAoKSBkaWQgbm90IHBhc3MgZW5vdWdoIHJlZnMgZm9yIHBhcnNlZCBmaWVsZHMiLAogICAgICAgIDMwMDcgPT4gIkVIUiAtIGJpbmRfY29sdW1ucyBuZWVkcyByZWZzIHRvIHdyaXRlYWJsZSBzY2FsYXJzIiwKICAgICAgICAzMDA4ID0+ICJFSFIgLSB1bmV4cGVjdGVkIGVycm9yIGluIGJvdW5kIGZpZWxkcyIsCgogICAgICAgIDAgICAgPT4gIiIsCn07CgoKbXkgJGxhc3RfbmV3X2Vycm9yID0gJyc7CgpteSAlZGVmX2F0dHIgPSAoCiAgICBxdW90ZV9jaGFyICAgICAgICAgID0+ICciJywKICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgc2VwX2NoYXIgICAgICAgICAgICA9PiAnLCcsCiAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgYWx3YXlzX3F1b3RlICAgICAgICA9PiAwLAogICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAwLAogICAga2VlcF9tZXRhX2luZm8gICAgICA9PiAwLAogICAgYWxsb3dfbG9vc2VfcXVvdGVzICA9PiAwLAogICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgYWxsb3dfd2hpdGVzcGFjZSAgICA9PiAwLAogICAgY2hvbXBfdmVyYmF0aW0gICAgICA9PiAwLAogICAgdHlwZXMgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIHZlcmJhdGltICAgICAgICAgICAgPT4gMCwKICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKCiAgICBfRU9GICAgICAgICAgICAgICAgID0+IDAsCiAgICBfU1RBVFVTICAgICAgICAgICAgID0+IHVuZGVmLAogICAgX0ZJRUxEUyAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIF9GRkxBR1MgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBfU1RSSU5HICAgICAgICAgICAgID0+IHVuZGVmLAogICAgX0VSUk9SX0lOUFVUICAgICAgICA9PiB1bmRlZiwKICAgIF9FUlJPUl9ESUFHICAgICAgICAgPT4gdW5kZWYsCgogICAgX0NPTFVNTl9OQU1FUyAgICAgICA9PiB1bmRlZiwKICAgIF9CT1VORF9DT0xVTU5TICAgICAgPT4gdW5kZWYsCik7CgoKQkVHSU4gewogICAgaWYgKCAkXSA8IDUuMDA2ICkgewogICAgICAgICRJTkN7J2J5dGVzLnBtJ30gPSAxIHVubGVzcyAkSU5DeydieXRlcy5wbSd9OyAjIGR1bW15CiAgICAgICAgbm8gc3RyaWN0ICdyZWZzJzsKICAgICAgICAqeyJ1dGY4Ojppc191dGY4In0gPSBzdWIgeyAwOyB9OwogICAgfQogICAgZWxzaWYgKCAkXSA8IDUuMDA4ICkgewogICAgICAgIG5vIHN0cmljdCAncmVmcyc7CiAgICAgICAgKnsidXRmODo6aXNfdXRmOCJ9ID0gc3ViIHsgMDsgfTsKICAgIH0KICAgIGVsc2lmICggIWRlZmluZWQgJnV0Zjg6OmlzX3V0ZjggKSB7CiAgICAgICByZXF1aXJlIEVuY29kZTsKICAgICAgICp1dGY4Ojppc191dGY4ID0gKkVuY29kZTo6aXNfdXRmODsKICAgIH0KCiAgICBldmFsIHF8IHJlcXVpcmUgU2NhbGFyOjpVdGlsIHw7CiAgICBpZiAoICRAICkgewogICAgICAgIGV2YWwgcXwgcmVxdWlyZSBCIHw7CiAgICAgICAgaWYgKCAkQCApIHsKICAgICAgICAgICAgQ2FycDo6Y3JvYWsgJEA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAqU2NhbGFyOjpVdGlsOjpyZWFkb25seSA9IHN1YiAoXCQpIHsKICAgICAgICAgICAgICAgIG15ICRiID0gQjo6c3ZyZWZfMm9iamVjdCggJF9bMF0gKTsKICAgICAgICAgICAgICAgICRiLT5GTEFHUyAmIDB4MDA4MDAwMDA7ICMgU1ZmX1JFQURPTkxZPwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHZlcnNpb24KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIHZlcnNpb24gewogICAgcmV0dXJuICRWRVJTSU9OOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbmV3CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBuZXcgewogICAgbXkgJHByb3RvID0gc2hpZnQ7CiAgICBteSAkYXR0ciAgPSBzaGlmdCB8fCB7fTsKCiAgICAkbGFzdF9uZXdfZXJyb3IgPSAndXNhZ2U6IG15ICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoW3sgb3B0aW9uID0+IHZhbHVlLCAuLi4gfV0pOyc7CgogICAgbXkgJGNsYXNzID0gcmVmKCRwcm90bykgfHwgJHByb3RvIG9yIHJldHVybjsKICAgIG15ICRzZWxmICA9IHsgJWRlZl9hdHRyIH07CgogICAgZm9yIG15ICRwcm9wIChrZXlzICUkYXR0cikgeyAjIGlmIGludmFsaWQgYXR0ciwgcmV0dXJuIHVuZGVmCiAgICAgICAgdW5sZXNzICgkcHJvcCA9fiAvXlthLXpdLyAmJiBleGlzdHMgJGRlZl9hdHRyeyRwcm9wfSkgewogICAgICAgICAgICAkbGFzdF9uZXdfZXJyb3IgPSAiVW5rbm93biBhdHRyaWJ1dGUgJyRwcm9wJyI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJHNlbGYtPnskcHJvcH0gPSAkYXR0ci0+eyRwcm9wfTsKICAgIH0KCiAgICAkbGFzdF9uZXdfZXJyb3IgPSAnJzsKCiAgICBibGVzcyAkc2VsZiwgJGNsYXNzOwoKICAgIGlmKGV4aXN0cygkc2VsZi0+e3R5cGVzfSkpIHsKICAgICAgICAkc2VsZi0+dHlwZXMoJHNlbGYtPnt0eXBlc30pOwogICAgfQoKICAgIHJldHVybiAkc2VsZjsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHN0YXR1cwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgc3RhdHVzIHsKICAgICRfWzBdLT57X1NUQVRVU307Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBlcnJvcl9pbnB1dAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgZXJyb3JfaW5wdXQgewogICAgJF9bMF0tPntfRVJST1JfSU5QVVR9Owp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZXJyb3JfZGlhZwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgZXJyb3JfZGlhZyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgQGRpYWcgPSAoMCwgJGxhc3RfbmV3X2Vycm9yLCAwKTsKCiAgICB1bmxlc3MgKCRzZWxmIGFuZCByZWYgJHNlbGYpIHsJIyBDbGFzcyBtZXRob2Qgb3IgZGlyZWN0IGNhbGwKICAgICAgICAkbGFzdF9uZXdfZXJyb3IgYW5kICRkaWFnWzBdID0gMTAwMDsKICAgIH0KICAgIGVsc2lmICggJHNlbGYtPmlzYSAoX19QQUNLQUdFX18pIGFuZCBkZWZpbmVkICRzZWxmLT57X0VSUk9SX0RJQUd9ICkgewogICAgICAgIEBkaWFnID0gKCAwICsgJHNlbGYtPntfRVJST1JfRElBR30sICRFUlJPUlMtPnsgJHNlbGYtPntfRVJST1JfRElBR30gfSApOwogICAgICAgIGV4aXN0cyAkc2VsZi0+e19FUlJPUl9QT1N9IGFuZCAkZGlhZ1syXSA9IDEgKyAkc2VsZi0+e19FUlJPUl9QT1N9OwogICAgfQoKICAgIG15ICRjb250ZXh0ID0gd2FudGFycmF5OwoKICAgIG15ICRkaWFnb2JqID0gYmxlc3MgXEBkaWFnLCAnVGV4dDo6Q1NWOjpFcnJvckRpYWcnOwoKICAgIHVubGVzcyAoZGVmaW5lZCAkY29udGV4dCkgewkjIFZvaWQgY29udGV4dAogICAgICAgIHByaW50IFNUREVSUiAiIyBDU1ZfUFAgRVJST1I6ICIsICRkaWFnWzBdLCAiIC0gJGRpYWdbMV1cbiIgaWYgKCAkZGlhZ1swXSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJGNvbnRleHQgPyBAZGlhZyA6ICRkaWFnb2JqOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc3RyaW5nCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCipzdHJpbmcgPSBcJl9zdHJpbmc7CnN1YiBfc3RyaW5nIHsKICAgIGRlZmluZWQgJF9bMF0tPntfU1RSSU5HfSA/ICR7ICRfWzBdLT57X1NUUklOR30gfSA6IHVuZGVmOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZmllbGRzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCipmaWVsZHMgPSBcJl9maWVsZHM7CnN1YiBfZmllbGRzIHsKICAgIHJlZigkX1swXS0+e19GSUVMRFN9KSA/ICBAeyRfWzBdLT57X0ZJRUxEU319IDogdW5kZWY7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBjb21iaW5lCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCipjb21iaW5lID0gXCZfY29tYmluZTsKc3ViIF9jb21iaW5lIHsKICAgIG15ICgkc2VsZiwgQHBhcnQpID0gQF87CgogICAgIyBhdCBsZWFzdCBvbmUgYXJndW1lbnQgd2FzIGdpdmVuIGZvciAiY29tYmluaW5nIi4uLgogICAgcmV0dXJuICRzZWxmLT57X1NUQVRVU30gPSAwIHVubGVzcyhAcGFydCk7CgogICAgJHNlbGYtPntfRklFTERTfSAgICAgID0gXEBwYXJ0OwogICAgJHNlbGYtPntfRVJST1JfSU5QVVR9ID0gdW5kZWY7CiAgICAkc2VsZi0+e19TVFJJTkd9ICAgICAgPSAnJzsKICAgICRzZWxmLT57X1NUQVRVU30gICAgICA9IDA7CgogICAgbXkgKCRhbHdheXNfcXVvdGUsICRiaW5hcnksICRxdW90LCAkc2VwLCAkZXNjKQogICAgICAgICAgICA9IEB7JHNlbGZ9e3F3L2Fsd2F5c19xdW90ZSBiaW5hcnkgcXVvdGVfY2hhciBzZXBfY2hhciBlc2NhcGVfY2hhci99OwoKICAgIGlmKCFkZWZpbmVkICRxdW90KXsgJHF1b3QgPSAnJzsgfQoKICAgIHJldHVybiAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKDEwMDEpIGlmICgkc2VwIGVxICRlc2Mgb3IgJHNlcCBlcSAkcXVvdCk7CgogICAgbXkgJHJlX2VzYyA9ICRzZWxmLT57X3JlX2NvbWJfZXNjYXBlfS0+eyRxdW90fS0+eyRlc2N9IHx8PSBxci8oXFEkcXVvdFxFfFxRJGVzY1xFKS87CiAgICBteSAkcmVfc3AgID0gJHNlbGYtPntfcmVfY29tYl9zcH0tPnskc2VwfSAgICAgICAgICAgICAgfHw9IHFyL1tcc1xRJHNlcFxFXS87CgogICAgbXkgJG11c3RfYmVfcXVvdGVkOwogICAgZm9yIG15ICRjb2x1bW4gKEBwYXJ0KSB7CgogICAgICAgIHVubGVzcyAoZGVmaW5lZCAkY29sdW1uKSB7CiAgICAgICAgICAgICRjb2x1bW4gPSAnJzsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhJGJpbmFyeSApIHsKICAgICAgICAgICAgJGJpbmFyeSA9IDEgaWYgdXRmODo6aXNfdXRmOCAkY29sdW1uOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkYmluYXJ5IGFuZCAkY29sdW1uID1+IC9bXlx4MDlceDIwLVx4N0VdLykgewogICAgICAgICAgICAjIGFuIGFyZ3VtZW50IGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNoYXJhY3Rlci4uLgogICAgICAgICAgICAkc2VsZi0+e19FUlJPUl9JTlBVVH0gPSAkY29sdW1uOwogICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKDIxMTApOwogICAgICAgICAgICByZXR1cm4gJHNlbGYtPntfU1RBVFVTfTsKICAgICAgICB9CgogICAgICAgICRtdXN0X2JlX3F1b3RlZCA9IDA7CgogICAgICAgIGlmKCRxdW90IG5lICcnIGFuZCAkY29sdW1uID1+IHMvJHJlX2VzYy8kZXNjJDEvZyl7CiAgICAgICAgICAgICRtdXN0X2JlX3F1b3RlZCsrOwogICAgICAgIH0KICAgICAgICBpZigkY29sdW1uID1+IC8kcmVfc3AvKXsKICAgICAgICAgICAgJG11c3RfYmVfcXVvdGVkKys7CiAgICAgICAgfQoKICAgICAgICBpZigkYmluYXJ5KXsKICAgICAgICAgICAgdXNlIGJ5dGVzOwogICAgICAgICAgICAkbXVzdF9iZV9xdW90ZWQrKyBpZiAoICRjb2x1bW4gPX4gcy9cMC8ke2VzY30wL2cgfHwgJGNvbHVtbiA9fiAvW1x4MDAtXHgxZlx4N2YtXHhhMF0vICk7CiAgICAgICAgfQoKICAgICAgICBpZigkYWx3YXlzX3F1b3RlIG9yICRtdXN0X2JlX3F1b3RlZCl7CiAgICAgICAgICAgICRjb2x1bW4gPSAkcXVvdCAuICRjb2x1bW4gLiAkcXVvdDsKICAgICAgICB9CiAgICB9CgogICAgJHNlbGYtPntfU1RSSU5HfSA9IFxkbyB7IGpvaW4oJHNlcCwgQHBhcnQpIC4gJHNlbGYtPntlb2x9IH07CiAgICAkc2VsZi0+e19TVEFUVVN9ID0gMTsKCiAgICByZXR1cm4gJHNlbGYtPntfU1RBVFVTfTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHBhcnNlCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCm15ICVhbGxvd19lb2wgPSAoIlxyIiA9PiAxLCAiXHJcbiIgPT4gMSwgIlxuIiA9PiAxLCAiIiA9PiAxKTsKCipwYXJzZSA9IFwmX3BhcnNlOwoKc3ViIF9wYXJzZSB7CiAgICBteSAoJHNlbGYsICRsaW5lKSA9IEBfOwoKICAgIEB7JHNlbGZ9e3F3L19TVFJJTkcgX0ZJRUxEUyBfU1RBVFVTIF9FUlJPUl9JTlBVVC99ID0gKCRsaW5lLCB1bmRlZiwgMCwgJGxpbmUpOwoKICAgIHJldHVybiAwIGlmKCFkZWZpbmVkICRsaW5lKTsKCiAgICBteSAoJGJpbmFyeSwgJHF1b3QsICRzZXAsICRlc2MsICR0eXBlcywgJGtlZXBfbWV0YV9pbmZvLCAkYWxsb3dfd2hpdGVzcGFjZSwgJGVvbCwgJGJsYW5rX2lzX3VuZGVmKQogICAgICAgICA9IEB7JHNlbGZ9e3F3L2JpbmFyeSBxdW90ZV9jaGFyIHNlcF9jaGFyIGVzY2FwZV9jaGFyIHR5cGVzIGtlZXBfbWV0YV9pbmZvIGFsbG93X3doaXRlc3BhY2UgZW9sIGJsYW5rX2lzX3VuZGVmL307CiAgICAkc2VwICA9ICJcMCIgdW5sZXNzIChkZWZpbmVkICRzZXApOwogICAgJGVzYyAgPSAiXDAiIHVubGVzcyAoZGVmaW5lZCAkZXNjKTsKICAgICRxdW90ID0gJycgICB1bmxlc3MgKGRlZmluZWQgJHF1b3QpOwoKICAgIHJldHVybiAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKDEwMDEpIGlmICgoJHNlcCBlcSAkZXNjIG9yICRzZXAgZXEgJHF1b3QpIGFuZCAkc2VwIG5lICJcMCIpOwoKICAgIG15ICRtZXRhX2ZsYWcgICAgICA9ICRrZWVwX21ldGFfaW5mbyA/IFtdIDogdW5kZWY7CiAgICBteSAkcmVfc3BsaXQgICAgICAgPSAkc2VsZi0+e19yZV9zcGxpdH0tPnskcXVvdH0tPnskZXNjfS0+eyRzZXB9IHx8PSBfbWFrZV9yZWdleHBfc3BsaXRfY29sdW1uKCRlc2MsICRxdW90LCAkc2VwKTsKICAgIG15ICRyZV9xdW90ZWQgICAgICAgPSAkc2VsZi0+e19yZV9xdW90ZWR9LT57JHF1b3R9ICAgICAgICAgICAgICAgfHw9IHFyL15cUSRxdW90XEUoLiopXFEkcXVvdFxFJC9zOwogICAgbXkgJHJlX2luX3F1b3RfZXNwMSA9ICRzZWxmLT57X3JlX2luX3F1b3RfZXNwMX0tPnskZXNjfSAgICAgICAgICB8fD0gcXIvXFEkZXNjXEUoLikvOwogICAgbXkgJHJlX2luX3F1b3RfZXNwMiA9ICRzZWxmLT57X3JlX2luX3F1b3RfZXNwMn0tPnskcXVvdH0tPnskZXNjfSB8fD0gcXIvW1xRJHF1b3QkZXNjXEUwXS87CiAgICBteSAkcmVfcXVvdF9jaGFyICAgID0gJHNlbGYtPntfcmVfcXVvdF9jaGFyfS0+eyRxdW90fSAgICAgICAgICAgIHx8PSBxci9cUSRxdW90XEUvOwogICAgbXkgJHJlX2VzYyAgICAgICAgICA9ICRzZWxmLT57X3JlX2VzY30tPnskcXVvdH0tPnskZXNjfSAgICAgICAgICB8fD0gcXIvXFEkZXNjXEUoXFEkcXVvdFxFfFxRJGVzY1xFfDApLzsKICAgIG15ICRyZV9pbnZhbGlkX3F1b3QgPSAkc2VsZi0+e19yZV9pbnZhbGlkX3F1b3R9LT57JHF1b3R9LT57JGVzY30gfHw9IHFyL14kcmVfcXVvdF9jaGFyfFteXFEkcmVfZXNjXEVdJHJlX3F1b3RfY2hhci87CiAgICBteSAkcmVfcnMgICAgICAgICAgID0gJHNlbGYtPntfcmVfcnN9LT57JC99IHx8PSBxcntcUSQvXEU/JH07ICMgJC8gLi4gaW5wdXQgcmVjb3JkIHNlcGFyYXRvcgoKICAgIGlmICgkYWxsb3dfd2hpdGVzcGFjZSkgewogICAgICAgICRyZV9zcGxpdCA9ICRzZWxmLT57X3JlX3NwbGl0X2FsbG93X3NwfS0+eyRxdW90fS0+eyRlc2N9LT57JHNlcH0KICAgICAgICAgICAgICAgICAgICAgfHw9IF9tYWtlX3JlZ2V4cF9zcGxpdF9jb2x1bW5fYWxsb3dfc3AoJGVzYywgJHF1b3QsICRzZXApOwogICAgfQoKICAgIG15ICRwYWxhdGFibGUgPSAxOwogICAgbXkgQHBhcnQgICAgICA9ICgpOwoKICAgIG15ICRpID0gMDsKICAgIG15ICRmbGFnOwoKICAgIGlmIChkZWZpbmVkICRlb2wgYW5kICRlb2wgZXEgIlxyIikgewogICAgICAgICRsaW5lID1+IHMvW1xyIF0qXHJbIF0qJC8vOwogICAgfQoKICAgIGlmICgkc2VsZi0+e3ZlcmJhdGltfSkgewogICAgICAgICRsaW5lIC49ICRzZXA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoZGVmaW5lZCAkZW9sIGFuZCAhJGFsbG93X2VvbHskZW9sfSkgewogICAgICAgICAgICAkbGluZSAuPSAkc2VwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJGxpbmUgPX4gcy8oPzpceDBEXHgwQXxceDBBKT8kfCg/Olx4MERceDBBfFx4MEEpWyBdKiQvJHNlcC87CiAgICAgICAgfQogICAgfQoKICAgIG15ICRwb3MgPSAwOwoKICAgIG15ICR1dGY4ID0gMSBpZiB1dGY4Ojppc191dGY4KCAkbGluZSApOyAjIGlmIFVURjggbWFya2VkLCBmbGFnIG9uLgoKICAgIGZvciBteSAkY29sICgkbGluZSA9fiAvJHJlX3NwbGl0L2cpIHsKCiAgICAgICAgaWYgKCRrZWVwX21ldGFfaW5mbykgewogICAgICAgICAgICAkZmxhZyA9IDB4MDAwMDsKICAgICAgICAgICAgJGZsYWcgfD0gSVNfQklOQVJZIGlmICgkY29sID1+IC9bXlx4MDlceDIwLVx4N0VdLyk7CiAgICAgICAgfQoKICAgICAgICAkcG9zICs9IGxlbmd0aCAkY29sOwoKICAgICAgICBpZiAoICggISRiaW5hcnkgYW5kICEkdXRmOCApIGFuZCAkY29sID1+IC9bXlx4MDlceDIwLVx4N0VdLykgeyAjIEJpbmFyeSBjaGFyYWN0ZXIsIGJpbmFyeSBvZmYKICAgICAgICAgICAgaWYgKCAkY29sID1+ICRyZV9xdW90ZWQgKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKAogICAgICAgICAgICAgICAgICAgICAgJGNvbCA9fiAvXG4oW15cbl0qKS8gPyAoMjAyMSwgJHBvcyAtIDEgLSBsZW5ndGggJDEpCiAgICAgICAgICAgICAgICAgICAgOiAkY29sID1+IC9ccihbXlxyXSopLyA/ICgyMDIyLCAkcG9zIC0gMSAtIGxlbmd0aCAkMSkKICAgICAgICAgICAgICAgICAgICA6ICgyMDI2LCAkcG9zIC0yKSAjIEJpbmFyeSBjaGFyYWN0ZXIgaW5zaWRlIHF1b3RlZCBmaWVsZCwgYmluYXJ5IG9mZgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fc2V0X2Vycm9yX2RpYWcoCiAgICAgICAgICAgICAgICAgICAgICAkY29sID1+IC9cUSRxdW90XEUoLiopXFEkcXVvdFxFXHIkLyAgID8gKDIwMTAsICRwb3MgLSAyKQogICAgICAgICAgICAgICAgICAgIDogJGNvbCA9fiAvXlxyLyAgICAgICAgICAgICAgICAgICAgICAgICA/ICgyMDMxLCAkcG9zIC0gbGVuZ3RoICRjb2wpCiAgICAgICAgICAgICAgICAgICAgOiAkY29sID1+IC9ccihbXlxyXSopLyAgICAgICAgICAgICAgICAgID8gKDIwMzIsICRwb3MgLSAxIC0gbGVuZ3RoICQxKQogICAgICAgICAgICAgICAgICAgIDogKDIwMzcsICRwb3MgLSBsZW5ndGggJGNvbCkgIyBCaW5hcnkgY2hhcmFjdGVyIGluIHVucXVvdGVkIGZpZWxkLCBiaW5hcnkgb2ZmCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwYWxhdGFibGUgPSAwOwogICAgICAgICAgICBsYXN0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAoJHV0ZjggYW5kICEkYmluYXJ5KSBhbmQgICRjb2wgPX4gL1xufFwwLyApIHsgIyBcbiBzdGlsbCBuZWVkcyBiaW5hcnkgKFRleHQ6OkNTVl9YUyAwLjUxIGNvbXBhdCkKICAgICAgICAgICAgJHNlbGYtPl9zZXRfZXJyb3JfZGlhZygyMDIxLCAkcG9zKTsKICAgICAgICAgICAgJHBhbGF0YWJsZSA9IDA7CiAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNvbCA9fiAkcmVfcXVvdGVkKSB7CiAgICAgICAgICAgICRmbGFnIHw9IElTX1FVT1RFRCBpZiAoJGtlZXBfbWV0YV9pbmZvKTsKICAgICAgICAgICAgJGNvbCA9ICQxOwoKICAgICAgICAgICAgaWYgKCRjb2wgPX4gJHJlX2luX3F1b3RfZXNwMSkgewogICAgICAgICAgICAgICAgbXkgJHN0ciA9ICQxOwogICAgICAgICAgICAgICAgaWYgKCRzdHIgIX4gJHJlX2luX3F1b3RfZXNwMikgewogICAgICAgICAgICAgICAgICAgIHVubGVzcyAoJHNlbGYtPnthbGxvd19sb29zZV9lc2NhcGVzfSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKCAyMDI1LCAkcG9zIC0gMiApOyAjIE5lZWRsZXNzIEVTQyBpbiBxdW90ZWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgJHBhbGF0YWJsZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkY29sID1+IHMvXFEkZXNjXEUoLikvJDEvZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoJGNvbCA9fiAvKD88IVxRJGVzY1xFKVxRJGVzY1xFLykgewogICAgICAgICAgICAgICAgICAgICRzZWxmLT5fc2V0X2Vycm9yX2RpYWcoIDQwMDIsICRwb3MgLSAxICk7ICMgTm8gZXNjYXBlZCBFU0MgaW4gcXVvdGVkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJHBhbGF0YWJsZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNvbCA9fiBzeyRyZV9lc2N9eyQxIGVxICcwJyA/ICJcMCIgOiAkMX1lZzsKCiAgICAgICAgICAgIGlmICgkdHlwZXMgYW5kICR0eXBlcy0+WyRpXSkgeyAjIElWIG9yIE5WCiAgICAgICAgICAgICAgICBfY2hlY2tfdHlwZShcJGNvbCwgJHR5cGVzLT5bJGldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBxdW90ZWQgYnV0IGludmFsaWQKCiAgICAgICAgZWxzaWYgKCRjb2wgPX4gJHJlX2ludmFsaWRfcXVvdCkgewoKICAgICAgICAgICAgdW5sZXNzICgkc2VsZi0+e2FsbG93X2xvb3NlX3F1b3Rlc30gYW5kICRjb2wgPX4gLyRyZV9xdW90X2NoYXIvKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKAogICAgICAgICAgICAgICAgICAgICAgJGNvbCA9fiAvXlxRJHF1b3RcRSguKilcUSRxdW90XEUuJC9zICA/ICgyMDExLCAkcG9zIC0gMikKICAgICAgICAgICAgICAgICAgICA6ICRjb2wgPX4gL14kcmVfcXVvdF9jaGFyLyAgICAgICAgICAgICAgPyAoMjAyNywgJHBvcyAtIDEpCiAgICAgICAgICAgICAgICAgICAgOiAoMjAzNCwgJHBvcyAtIGxlbmd0aCAkY29sKSAjIExvb3NlIHVuZXNjYXBlZCBxdW90ZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRwYWxhdGFibGUgPSAwOwogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGVsc2lmICgkdHlwZXMgYW5kICR0eXBlcy0+WyRpXSkgeyAjIElWIG9yIE5WCiAgICAgICAgICAgIF9jaGVja190eXBlKFwkY29sLCAkdHlwZXMtPlskaV0pOwogICAgICAgIH0KCiAgICAgICAgIyB1bnF1b3RlZAoKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIGlmICghJHNlbGYtPnt2ZXJiYXRpbX0gYW5kICRjb2wgPX4gL1xyXG58XG4vKSB7CiAgICAgICAgICAgICAgICB1bmxlc3MgKGRlZmluZWQgJGVvbCBhbmQgISRhbGxvd19lb2x7JGVvbH0pIHsKICAgICAgICAgICAgICAgICAgICAkY29sID1+IHMvKD86XHJcbnxcbikuKi8vc207CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkY29sID1+IC9cUSRlc2NcRVxyJC8pIHsgIyBmb3IgdC8xNV9mbGFncyA6IHRlc3QgMTY1ICdFU0MgQ1InIGF0IGxpbmUgMjAzCiAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKCA0MDAzLCAkcG9zICk7CiAgICAgICAgICAgICAgICAkcGFsYXRhYmxlID0gMDsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkY29sID1+IC8uXFEkZXNjXEUkLykgeyAjIGZvciB0LzY1X2FsbG93IDogdGVzdCA1My01NCBwYXJzZSgnZm9vXCcpIGF0IGxpbmUgNjIsIDY1CiAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKCA0MDA0LCAkcG9zICk7CiAgICAgICAgICAgICAgICAkcGFsYXRhYmxlID0gMDsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJGNvbCBlcSAnJyBhbmQgJGJsYW5rX2lzX3VuZGVmICkgewogICAgICAgICAgICAgICAgJGNvbCA9IHVuZGVmOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgcHVzaCBAcGFydCwkY29sOwogICAgICAgIHB1c2ggQHskbWV0YV9mbGFnfSwgJGZsYWcgaWYgKCRrZWVwX21ldGFfaW5mbyk7CgogICAgICAgICRpKys7CiAgICB9CgogICAgaWYgKCRwYWxhdGFibGUgYW5kICEgQHBhcnQpIHsKICAgICAgICAkcGFsYXRhYmxlID0gMDsKICAgIH0KCiAgICBpZiAoJHBhbGF0YWJsZSkgewogICAgICAgICRzZWxmLT57X0VSUk9SX0lOUFVUfSA9IHVuZGVmOwogICAgICAgICRzZWxmLT57X0ZJRUxEU30gICAgICA9IFxAcGFydDsKICAgIH0KCiAgICAkc2VsZi0+e19GRkxBR1N9ID0gJGtlZXBfbWV0YV9pbmZvID8gJG1ldGFfZmxhZyA6IFtdOwoKICAgIHJldHVybiAkc2VsZi0+e19TVEFUVVN9ID0gJHBhbGF0YWJsZTsKfQoKCnN1YiBfbWFrZV9yZWdleHBfc3BsaXRfY29sdW1uIHsKICAgIG15ICgkZXNjLCAkcXVvdCwgJHNlcCkgPSBAXzsKICAgIHFyLygKICAgICAgICBcUSRxdW90XEUKICAgICAgICAgICAgW15cUSRxdW90JGVzY1xFXSooPzpcUSRlc2NcRVtcUSRxdW90JGVzY1xFMF1bXlxRJHF1b3QkZXNjXEVdKikqCiAgICAgICAgXFEkcXVvdFxFCiAgICAgICAgfCAjIG9yCiAgICAgICAgW15cUSRzZXBcRV0qCiAgICAgICApCiAgICAgICBcUSRzZXBcRQogICAgL3hzOwp9CgoKc3ViIF9tYWtlX3JlZ2V4cF9zcGxpdF9jb2x1bW5fYWxsb3dfc3AgewogICAgbXkgKCRlc2MsICRxdW90LCAkc2VwKSA9IEBfOwogICAgcXIvW1x4MjBceDA5XSoKICAgICAgICgKICAgICAgICBcUSRxdW90XEUKICAgICAgICAgICAgW15cUSRxdW90JGVzY1xFXSooPzpcUSRlc2NcRVtcUSRxdW90JGVzY1xFMF1bXlxRJHF1b3QkZXNjXEVdKikqCiAgICAgICAgXFEkcXVvdFxFCiAgICAgICAgfCAjIG9yCiAgICAgICAgW15cUSRzZXBcRV0qPwogICAgICAgKQogICAgICAgW1x4MjBceDA5XSpcUSRzZXBcRVtceDIwXHgwOV0qCiAgICAveHM7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBwcmludAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnQgewogICAgbXkgKCRzZWxmLCAkaW8sICRjb2xzKSA9IEBfOwoKICAgIHJlcXVpcmUgSU86OkhhbmRsZTsKCiAgICBpZihyZWYoJGNvbHMpIG5lICdBUlJBWScpewogICAgICAgIENhcnA6OmNyb2FrKCJFeHBlY3RlZCBmaWVsZHMgdG8gYmUgYW4gYXJyYXkgcmVmIik7CiAgICB9CgogICAgJHNlbGYtPl9jb21iaW5lKEAkY29scykgb3IgcmV0dXJuICcnOwoKICAgICRpby0+cHJpbnQoICRzZWxmLT5fc3RyaW5nICk7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBnZXRsaW5lCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBnZXRsaW5lIHsKICAgIG15ICgkc2VsZiwgJGlvKSA9IEBfOwoKICAgIHJlcXVpcmUgSU86OkhhbmRsZTsKCiAgICAkc2VsZi0+e19FT0Z9ID0gZW9mKCRpbykgPyAxIDogJyc7CgogICAgbXkgJGxpbmUgPSAkaW8tPmdldGxpbmUoKTsKICAgIG15ICRxdW90ID0gJHNlbGYtPntxdW90ZV9jaGFyfTsKICAgIG15ICRyZSAgID0gcXIvKD86XFEkcXVvdFxFKS87CgogICAgJGxpbmUgLj0gJGlvLT5nZXRsaW5lKCkgd2hpbGUgKCBkZWZpbmVkICRsaW5lIGFuZCBzY2FsYXIobXkgQGxpc3QgPSAkbGluZSA9fiAvJHJlL2cpICUgMiBhbmQgIWVvZigkaW8pICk7CgogICAgbXkgJGVvbCA9ICRzZWxmLT57ZW9sfTsKCiAgICBpZiAoZGVmaW5lZCAkZW9sIGFuZCBkZWZpbmVkICRsaW5lKSB7CiAgICAgICAgJGxpbmUgPX4gcy9cUSRlb2xcRSQvLzsKICAgIH0KCiAgICAkc2VsZi0+X3BhcnNlKCRsaW5lKSBvciByZXR1cm47CgogICAgaWYgKCAkc2VsZi0+e19CT1VORF9DT0xVTU5TfSApIHsKICAgICAgICBteSBAdmFscyAgPSAkc2VsZi0+X2ZpZWxkcygpOwogICAgICAgIG15ICggJG1heCwgJGNvdW50ICkgPSAoIHNjYWxhciBAdmFscywgMCApOwoKICAgICAgICBpZiAoIEB7ICRzZWxmLT57X0JPVU5EX0NPTFVNTlN9IH0gPCAkbWF4ICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9zZXRfZXJyb3JfZGlhZygzMDA2KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGZvciAoIG15ICRpID0gMDsgJGkgPCAkbWF4OyAkaSsrICkgewogICAgICAgICAgICBteSAkYmluZCA9ICRzZWxmLT57X0JPVU5EX0NPTFVNTlN9LT5bICRpIF07CiAgICAgICAgICAgIGlmICggU2NhbGFyOjpVdGlsOjpyZWFkb25seSggJCRiaW5kICkgKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+X3NldF9lcnJvcl9kaWFnKDMwMDgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQkYmluZCA9ICR2YWxzWyAkaSBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFtdOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgWyAkc2VsZi0+X2ZpZWxkcygpIF07CiAgICB9Cgp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZ2V0bGluZV9ocgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgZ2V0bGluZV9ociB7CiAgICBteSAoICRzZWxmLCAkaW8pID0gQF87CiAgICBteSAlaHI7CgogICAgdW5sZXNzICggJHNlbGYtPntfQ09MVU1OX05BTUVTfSApIHsKICAgICAgICAkc2VsZi0+U2V0RGlhZyggMzAwMiApOwogICAgfQoKICAgIG15ICRmciA9ICRzZWxmLT5nZXRsaW5lKCAkaW8gKSBvciByZXR1cm4gdW5kZWY7CgogICAgQGhyeyBAeyAkc2VsZi0+e19DT0xVTU5fTkFNRVN9IH0gfSA9IEAkZnI7CgogICAgXCVocjsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGNvbHVtbl9uYW1lcwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgY29sdW1uX25hbWVzIHsKICAgIG15ICggJHNlbGYsIEBjbHVtbnMgKSA9IEBfOwoKICAgIEBjbHVtbnMgb3IgcmV0dXJuIGRlZmluZWQgJHNlbGYtPntfQ09MVU1OX05BTUVTfSA/IEB7JHNlbGYtPntfQ09MVU1OX05BTUVTfX0gOiB1bmRlZjsKICAgIEBjbHVtbnMgPT0gMSAmJiAhIGRlZmluZWQgJGNsdW1uc1swXSBhbmQgcmV0dXJuICRzZWxmLT57X0NPTFVNTl9OQU1FU30gPSB1bmRlZjsKCiAgICBpZiAoIEBjbHVtbnMgPT0gMSAmJiByZWYgJGNsdW1uc1swXSBlcSAiQVJSQVkiICkgewogICAgICAgIEBjbHVtbnMgPSBAeyAkY2x1bW5zWzBdIH07CiAgICB9CiAgICBlbHNpZiAoIGpvaW4gIiIsIG1hcCB7IGRlZmluZWQgJF8gPyByZWYgJF8gOiAiVU5ERUYiIH0gQGNsdW1ucyApIHsKICAgICAgICAkc2VsZi0+U2V0RGlhZyggMzAwMSApOwogICAgfQoKICAgIGlmICggJHNlbGYtPntfaXNfYm91bmR9ICYmIEBjbHVtbnMgIT0gJHNlbGYtPntfaXNfYm91bmR9ICkgewogICAgICAgICRzZWxmLT5TZXREaWFnKCAzMDAzICk7CiAgICB9CgogICAgJHNlbGYtPntfQ09MVU1OX05BTUVTfSA9IFsgQGNsdW1ucyBdOwoKICAgIEBjbHVtbnM7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBiaW5kX2NvbHVtbnMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIGJpbmRfY29sdW1ucyB7CiAgICBteSAoICRzZWxmLCBAcmVmcyApID0gQF87CgogICAgQHJlZnMgb3IgcmV0dXJuIGRlZmluZWQgJHNlbGYtPntfQk9VTkRfQ09MVU1OU30gPyBAeyRzZWxmLT57X0JPVU5EX0NPTFVNTlN9fSA6IHVuZGVmOwogICAgQHJlZnMgPT0gMSAmJiAhIGRlZmluZWQgJHJlZnNbMF0gYW5kIHJldHVybiAkc2VsZi0+e19CT1VORF9DT0xVTU5TfSA9IHVuZGVmOwoKICAgIGlmICggJHNlbGYtPntfQ09MVU1OX05BTUVTfSAmJiBAcmVmcyAhPSBAeyRzZWxmLT57X0NPTFVNTl9OQU1FU319ICkgewogICAgICAgICRzZWxmLT5TZXREaWFnKCAzMDAzICk7CiAgICB9CgogICAgaWYgKCBncmVwIHsgcmVmICRfIG5lICJTQ0FMQVIiIH0gQHJlZnMgKSB7ICMgd2h5IGRvbid0IHVzZSBncmVwPwogICAgICAgICRzZWxmLT5TZXREaWFnKCAzMDA0ICk7CiAgICB9CgogICAgJHNlbGYtPntfaXNfYm91bmR9ID0gc2NhbGFyIEByZWZzOyAjcGFjaygiQyIsIHNjYWxhciBAcmVmcyk7CiAgICAkc2VsZi0+e19CT1VORF9DT0xVTU5TfSA9IFsgQHJlZnMgXTsKICAgIEByZWZzOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZW9mCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBlb2YgewogICAgJF9bMF0tPntfRU9GfTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHR5cGUKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIHR5cGVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKEBfKSB7CiAgICAgICAgaWYgKG15ICR0eXBlcyA9IHNoaWZ0KSB7CiAgICAgICAgICAgICRzZWxmLT57J190eXBlcyd9ID0gam9pbigiIiwgbWFweyBjaHIoJF8pIH0gQCR0eXBlcyk7CiAgICAgICAgICAgICRzZWxmLT57J3R5cGVzJ30gPSAkdHlwZXM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkZWxldGUgJHNlbGYtPnsndHlwZXMnfTsKICAgICAgICAgICAgZGVsZXRlICRzZWxmLT57J190eXBlcyd9OwogICAgICAgICAgICB1bmRlZjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkc2VsZi0+eyd0eXBlcyd9OwogICAgfQp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBtZXRhX2luZm8gewogICAgJF9bMF0tPntfRkZMQUdTfSA/IEB7ICRfWzBdLT57X0ZGTEFHU30gfSA6IHVuZGVmOwp9CgpzdWIgaXNfcXVvdGVkIHsKICAgIHJldHVybiB1bmxlc3MgKGRlZmluZWQgJF9bMF0tPntfRkZMQUdTfSk7CiAgICByZXR1cm4gaWYoICRfWzFdID1+IC9cRC8gb3IgJF9bMV0gPCAwIG9yICAkX1sxXSA+ICQjeyAkX1swXS0+e19GRkxBR1N9IH0gKTsKCiAgICAkX1swXS0+e19GRkxBR1N9LT5bJF9bMV1dICYgSVNfUVVPVEVEID8gMSA6IDA7Cn0KCnN1YiBpc19iaW5hcnkgewogICAgcmV0dXJuIHVubGVzcyAoZGVmaW5lZCAkX1swXS0+e19GRkxBR1N9KTsKICAgIHJldHVybiBpZiggJF9bMV0gPX4gL1xELyBvciAkX1sxXSA8IDAgb3IgICRfWzFdID4gJCN7ICRfWzBdLT57X0ZGTEFHU30gfSApOwogICAgJF9bMF0tPntfRkZMQUdTfS0+WyRfWzFdXSAmIElTX0JJTkFSWSA/IDEgOiAwOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgX2NoZWNrX3R5cGUKIyAgdGFrZSBhbiBhcmcgYXMgc2NhbGFyIHJlZmVycmVuY2UuCiMgIGlmIG5vdCBudW1lcmljLCBtYWtlIHRoZSB2YWx1ZSAwLiBvdGhlcndpc2UgSU5URUdFUml6ZWQuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBfY2hlY2tfdHlwZSB7CiAgICBteSAoJGNvbF9yZWYsICR0eXBlKSA9IEBfOwogICAgdW5sZXNzICgkJGNvbF9yZWYgPX4gL15bKy1dPyg/PVxkfFwuXGQpXGQqKFwuXGQqKT8oW0VlXShbKy1dP1xkKykpPyQvKSB7CiAgICAgICAgQ2FycDo6Y2FycCBzcHJpbnRmKCJBcmd1bWVudCBcIiVzXCIgaXNuJ3QgbnVtZXJpYyBpbiBzdWJyb3V0aW5lIGVudHJ5IiwkJGNvbF9yZWYpOwogICAgICAgICQkY29sX3JlZiA9IDA7CiAgICB9CiAgICBlbHNpZiAoJHR5cGUgPT0gTlYpIHsKICAgICAgICAkJGNvbF9yZWYgPSBzcHJpbnRmKCIlRyIsJCRjb2xfcmVmKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICQkY29sX3JlZiA9IHNwcmludGYoIiVkIiwkJGNvbF9yZWYpOwogICAgfQp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgX3NldF9lcnJvcl9kaWFnCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBfc2V0X2Vycm9yX2RpYWcgewogICAgbXkgKCAkc2VsZiwgJGVycm9yLCAkcG9zICkgPSBAXzsKCiAgICAkc2VsZi0+e19FUlJPUl9ESUFHfSA9ICRlcnJvcjsKCiAgICBpZiAoZGVmaW5lZCAkcG9zKSB7CiAgICAgICAgJF9bMF0tPntfRVJST1JfUE9TfSA9ICRwb3M7CiAgICB9CgogICAgcmV0dXJuOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpCRUdJTiB7CiAgICBmb3IgbXkgJG1ldGhvZCAocXcvcXVvdGVfY2hhciBlc2NhcGVfY2hhciBzZXBfY2hhciBlb2wgYWx3YXlzX3F1b3RlIGJpbmFyeSBhbGxvd193aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBfbWV0YV9pbmZvIGFsbG93X2xvb3NlX3F1b3RlcyBhbGxvd19sb29zZV9lc2NhcGVzIHZlcmJhdGltIGJsYW5rX2lzX3VuZGVmLykgewogICAgICAgIGV2YWwgcXF8CiAgICAgICAgICAgIHN1YiAkbWV0aG9kIHsKICAgICAgICAgICAgICAgIFwkX1swXS0+eyRtZXRob2R9ID0gXCRfWzFdIGlmIChcQF8gPiAxKTsKICAgICAgICAgICAgICAgIFwkX1swXS0+eyRtZXRob2R9OwogICAgICAgICAgICB9CiAgICAgICAgfDsKICAgIH0KfQoKCnN1YiBTZXREaWFnIHsKICAgIGlmICggZGVmaW5lZCAkX1sxXSBhbmQgJF9bMV0gPT0gMCApIHsKICAgICAgICAkX1swXS0+e19FUlJPUl9ESUFHfSA9IHVuZGVmOwogICAgfQoKICAgICRfWzBdLT5fc2V0X2Vycm9yX2RpYWcoICRfWzFdICk7CiAgICBDYXJwOjpjcm9hayggJF9bMF0tPmVycm9yX2RpYWcgLiAnJyApOwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpwYWNrYWdlIFRleHQ6OkNTVjo6RXJyb3JEaWFnOwoKdXNlIHN0cmljdDsKdXNlIG92ZXJsb2FkICgKICAgICciIicgPT4gXCZzdHJpbmdpZnksCiAgICAnKycgID0+IFwmbnVtZXJpYywKICAgICctJyAgPT4gXCZudW1lcmljLAogICAgJyonICA9PiBcJm51bWVyaWMsCiAgICAnLycgID0+IFwmbnVtZXJpYywKKTsKCgpzdWIgbnVtZXJpYyB7CiAgICBteSAoJGxlZnQsICRyaWdodCkgPSBAXzsKICAgIHJldHVybiByZWYgJGxlZnQgPyAkbGVmdC0+WzBdIDogJHJpZ2h0LT5bMF07Cn0KCgpzdWIgc3RyaW5naWZ5IHsKICAgICRfWzBdLT5bMV07Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKMTsKX19FTkRfXwoKPWhlYWQxIE5BTUUKClRleHQ6OkNTVl9QUCAtIFRleHQ6OkNTVl9YUyBjb21wYXRpYmxlIHB1cmUtUGVybCBtb2R1bGUKCgo9aGVhZDEgU1lOT1BTSVMKCiB1c2UgVGV4dDo6Q1NWX1BQOwogCiAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcoKTsgICAgICMgY3JlYXRlIGEgbmV3IG9iamVjdAogIyBJZiB5b3Ugd2FudCB0byBoYW5kbGUgbm9uLWFzY2lpIGNoYXIuCiAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcoe2JpbmFyeSA9PiAxfSk7CiAKICRzdGF0dXMgPSAkY3N2LT5jb21iaW5lKEBjb2x1bW5zKTsgICAgIyBjb21iaW5lIGNvbHVtbnMgaW50byBhIHN0cmluZwogJGxpbmUgICA9ICRjc3YtPnN0cmluZygpOyAgICAgICAgICAgICAjIGdldCB0aGUgY29tYmluZWQgc3RyaW5nCiAKICRzdGF0dXMgID0gJGNzdi0+cGFyc2UoJGxpbmUpOyAgICAgICAgIyBwYXJzZSBhIENTViBzdHJpbmcgaW50byBmaWVsZHMKIEBjb2x1bW5zID0gJGNzdi0+ZmllbGRzKCk7ICAgICAgICAgICAgIyBnZXQgdGhlIHBhcnNlZCBmaWVsZHMKIAogJHN0YXR1cyAgICAgICA9ICRjc3YtPnN0YXR1cyAoKTsgICAgICAjIGdldCB0aGUgbW9zdCByZWNlbnQgc3RhdHVzCiAkYmFkX2FyZ3VtZW50ID0gJGNzdi0+ZXJyb3JfaW5wdXQgKCk7ICMgZ2V0IHRoZSBtb3N0IHJlY2VudCBiYWQgYXJndW1lbnQKICRkaWFnICAgICAgICAgPSAkY3N2LT5lcnJvcl9kaWFnICgpOyAgIyBpZiBhbiBlcnJvciBvY2N1cmVkLCBleHBsYWlucyBXSFkKIAogJHN0YXR1cyA9ICRjc3YtPnByaW50ICgkaW8sICRjb2xyZWYpOyAjIFdyaXRlIGFuIGFycmF5IG9mIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGltbWVkaWF0ZWx5IHRvIGEgZmlsZSAkaW8KICRjb2xyZWYgPSAkY3N2LT5nZXRsaW5lICgkaW8pOyAgICAgICAgIyBSZWFkIGEgbGluZSBmcm9tIGZpbGUgJGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBhcnNlIGl0IGFuZCByZXR1cm4gYW4gYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZWYgb2YgZmllbGRzCiAkY3N2LT5jb2x1bW5fbmFtZXMgKEBuYW1lcyk7ICAgICAgICAgICMgU2V0IGNvbHVtbiBuYW1lcyBmb3IgZ2V0bGluZV9ociAoKQogJHJlZiA9ICRjc3YtPmdldGxpbmVfaHIgKCRpbyk7ICAgICAgICAjIGdldGxpbmUgKCksIGJ1dCByZXR1cm5zIGEgaGFzaHJlZgogJGVvZiA9ICRjc3YtPmVvZiAoKTsgICAgICAgICAgICAgICAgICAjIEluZGljYXRlIGlmIGxhc3QgcGFyc2Ugb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXRsaW5lICgpIGhpdCBFbmQgT2YgRmlsZQogCiAkY3N2LT50eXBlcyhcQHRfYXJyYXkpOyAgICAgICAgICAgICAgICMgU2V0IGNvbHVtbiB0eXBlcwoKCj1oZWFkMSBERVNDUklQVElPTgoKVGV4dDo6Q1NWX1BQIGhhcyBhbG1vc3Qgc2FtZSBmdW5jdGlvbnMgb2YgTDxUZXh0OjpDU1ZfWFM+IHdoaWNoIApwcm92aWRlcyBmYWNpbGl0aWVzIGZvciB0aGUgY29tcG9zaXRpb24gYW5kIGRlY29tcG9zaXRpb24gb2YKY29tbWEtc2VwYXJhdGVkIHZhbHVlcy4gQXMgaXRzIG5hbWUgc3VnZ2VzdHMsIEw8VGV4dDo6Q1NWX1hTPgppcyBhIFhTIG1vZHVsZSBhbmQgVGV4dDo6Q1NWX1BQIGlzIGEgUHVlciBQZXJsIG9uZS4KCj1oZWFkMiBVbmljb2RlIChVVEY4KQoKT24gcGFyc2luZyAoYm90aCBmb3IgQzxnZXRsaW5lICgpPiBhbmQgQzxwYXJzZSAoKT4pLCBpZiB0aGUgc291cmNlIGlzCm1hcmtlZCBiZWluZyBVVEY4LCB0aGVuIHBhcnNpbmcgdGhhdCBzb3VyY2Ugd2lsbCBtYXJrIGFsbCBmaWVsZHMgdGhhdAphcmUgbWFya2VkIGJpbmFyeSB3aWxsIGFsc28gYmUgbWFya2VkIFVURjguCgpPbiBjb21iaW5pbmcgKEM8cHJpbnQgKCk+IGFuZCBDPGNvbWJpbmUgKCk+KSwgaWYgYW55IG9mIHRoZSBjb21iaW5pbmcKZmllbGRzIHdhcyBtYXJrZWQgVVRGOCwgdGhlIHJlc3VsdGluZyBzdHJpbmcgd2lsbCBiZSBtYXJrZWQgVVRGOC4KCj1oZWFkMSBGVU5DVElPTlMKClRoZXNlIG1ldGhvZHMgYXJlIGFsbW9zdCBzYW1lIGFzIFRleHQ6OkNTVl9YUy4KTW9zdCBvZiB0aGUgZG9jdW1lbnRhdGlvbiB3YXMgc2hhbWVsZXNzbHkgY29waWVkIGFuZCByZXBsYWNlZCBmcm9tIFRleHQ6OkNTVl9YUy4KClNlZSB0byBMPFRleHQ6OkNTVl9YUz4uCgo9aGVhZDIgdmVyc2lvbiAoKQoKKENsYXNzIG1ldGhvZCkgUmV0dXJucyB0aGUgY3VycmVudCBtb2R1bGUgdmVyc2lvbi4KCj1oZWFkMiBuZXcgKFwlYXR0cikKCihDbGFzcyBtZXRob2QpIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgVGV4dDo6Q1NWX1hTLiBUaGUgb2JqZWN0cwphdHRyaWJ1dGVzIGFyZSBkZXNjcmliZWQgYnkgdGhlIChvcHRpb25hbCkgaGFzaCByZWYgQzxcJWF0dHI+LgpDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGU6Cgo9b3ZlciA0Cgo9aXRlbSBlb2wKCkFuIGVuZC1vZi1saW5lIHN0cmluZyB0byBhZGQgdG8gcm93cywgdXN1YWxseSBDPHVuZGVmPiAobm90aGluZywKZGVmYXVsdCksIEM8IlwwMTIiPiAoTGluZSBGZWVkKSBvciBDPCJcMDE1XDAxMiI+IChDYXJyaWFnZSBSZXR1cm4sCkxpbmUgRmVlZCkuIENhbm5vdCBiZSBsb25nZXIgdGhhbiA3IChBU0NJSSkgY2hhcmFjdGVycy4KCklmIGJvdGggQzwkLz4gYW5kIEM8ZW9sPiBlcXVhbCBDPCJcMDE1Ij4sIHBhcnNpbmcgbGluZXMgdGhhdCBlbmQgb24Kb25seSBhIENhcnJpYWdlIFJldHVybiB3aXRob3V0IExpbmUgRmVlZCwgd2lsbCBiZSBDPHBhcnNlPmQgY29ycmVjdC4KTGluZSBlbmRpbmdzLCB3aGV0aGVyIGluIEM8JC8+IG9yIEM8ZW9sPiwgb3RoZXIgdGhhbiBDPHVuZGVmPiwKQzwiXG4iPiwgQzwiXHJcbiI+LCBvciBDPCJcciI+IGFyZSBub3QgKHlldCkgc3VwcG9ydGVkIGZvciBwYXJzaW5nLgoKPWl0ZW0gc2VwX2NoYXIKClRoZSBjaGFyIHVzZWQgZm9yIHNlcGFyYXRpbmcgZmllbGRzLCBieSBkZWZhdWx0IGEgY29tbWEuIChDPCw+KS4KTGltaXRlZCB0byBhIHNpbmdsZS1ieXRlIGNoYXJhY3RlciwgdXN1YWxseSBpbiB0aGUgcmFuZ2UgZnJvbSAweDIwCihzcGFjZSkgdG8gMHg3ZSAodGlsZGUpLgoKVGhlIHNlcGFyYXRpb24gY2hhcmFjdGVyIGNhbiBub3QgYmUgZXF1YWwgdG8gdGhlIHF1b3RlIGNoYXJhY3Rlci4KVGhlIHNlcGFyYXRpb24gY2hhcmFjdGVyIGNhbiBub3QgYmUgZXF1YWwgdG8gdGhlIGVzY2FwZSBjaGFyYWN0ZXIuCgo9aXRlbSBhbGxvd193aGl0ZXNwYWNlCgpXaGVuIHRoaXMgb3B0aW9uIGlzIHNldCB0byB0cnVlLCB3aGl0ZXNwYWNlIChUQUIncyBhbmQgU1BBQ0UncykKc3Vycm91bmRpbmcgdGhlIHNlcGFyYXRpb24gY2hhcmFjdGVyIGlzIHJlbW92ZWQgd2hlbiBwYXJzaW5nLiBTbwpsaW5lcyBsaWtlOgoKICAxICwgImZvbyIgLCBiYXIgLCAzICwgemFwcAoKYXJlIG5vdyBjb3JyZWN0bHkgcGFyc2VkLCBldmVuIHRob3VnaCBpdCB2aW9sYXRlcyB0aGUgQ1NWIHNwZWNzLgpOb3RlIHRoYXQgQjxhbGw+IHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQgZnJvbSBzdGFydCBhbmQgZW5kIG9mIGVhY2gKZmllbGQuIFRoYXQgd291bGQgbWFrZSBpcyBtb3JlIGEgSTxmZWF0dXJlPiB0aGFuIGEgd2F5IHRvIGJlIGFibGUKdG8gcGFyc2UgYmFkIENTViBsaW5lcywgYXMKCiAxLCAgIDIuMCwgIDMsICAgYXBlICAsIG1vbmtleQoKd2lsbCBub3cgYmUgcGFyc2VkIGFzCgogKCIxIiwgIjIuMCIsICIzIiwgImFwZSIsICJtb25rZXkiKQoKZXZlbiBpZiB0aGUgb3JpZ2luYWwgbGluZSB3YXMgcGVyZmVjdGx5IHNhbmUgQ1NWLgoKPWl0ZW0gYmxhbmtfaXNfdW5kZWYKClVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBDU1YgZGF0YSBtYWtlcyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuCnF1b3RlZC0gYW5kIHVucXVvdGVkIGVtcHR5IGZpZWxkcy4gVGhleSBib3RoIGVuZCB1cCBpbiBhbiBlbXB0eQpzdHJpbmcgZmllbGQgb25jZSByZWFkLCBzbwoKIDEsIiIsLCIgIiwyCgppcyByZWFkIGFzCgogKCIxIiwgIiIsICIiLCAiICIsICIyIikKCldoZW4gSTx3cml0aW5nPiBDU1YgZmlsZXMgd2l0aCBDPGFsd2F5c19xdW90ZT4gc2V0LCB0aGUgdW5xdW90ZWQgZW1wdHkKZmllbGQgaXMgdGhlIHJlc3VsdCBvZiBhbiB1bmRlZmluZWQgdmFsdWUuIFRvIG1ha2UgaXQgcG9zc2libGUgdG8gYWxzbwptYWtlIHRoaXMgZGlzdGluY3Rpb24gd2hlbiByZWFkaW5nIENTViBkYXRhLCB0aGUgQzxibGFua19pc191bmRlZj4gb3B0aW9uCndpbGwgY2F1c2UgdW5xdW90ZWQgZW1wdHkgZmllbGRzIHRvIGJlIHNldCB0byB1bmRlZiwgY2F1c2luZyB0aGUgYWJvdmUgdG8KYmUgcGFyc2VkIGFzCgogKCIxIiwgIiIsIHVuZGVmLCAiICIsICIyIikKCj1pdGVtIHF1b3RlX2NoYXIKClRoZSBjaGFyIHVzZWQgZm9yIHF1b3RpbmcgZmllbGRzIGNvbnRhaW5pbmcgYmxhbmtzLCBieSBkZWZhdWx0IHRoZQpkb3VibGUgcXVvdGUgY2hhcmFjdGVyIChDPCI+KS4gQSB2YWx1ZSBvZiB1bmRlZiBzdXBwcmVzc2VzCnF1b3RlIGNoYXJzLiAoRm9yIHNpbXBsZSBjYXNlcyBvbmx5KS4KTGltaXRlZCB0byBhIHNpbmdsZS1ieXRlIGNoYXJhY3RlciwgdXN1YWxseSBpbiB0aGUgcmFuZ2UgZnJvbSAweDIwCihzcGFjZSkgdG8gMHg3ZSAodGlsZGUpLgoKVGhlIHF1b3RlIGNoYXJhY3RlciBjYW4gbm90IGJlIGVxdWFsIHRvIHRoZSBzZXBhcmF0aW9uIGNoYXJhY3Rlci4KCj1pdGVtIGFsbG93X2xvb3NlX3F1b3RlcwoKQnkgZGVmYXVsdCwgcGFyc2luZyBmaWVsZHMgdGhhdCBoYXZlIEM8cXVvdGVfY2hhcj4gY2hhcmFjdGVycyBpbnNpZGUKYW4gdW5xdW90ZWQgZmllbGQsIGxpa2UKCiAxLGZvbyAiYmFyIiBiYXosNDIKCndvdWxkIHJlc3VsdCBpbiBhIHBhcnNlIGVycm9yLiBUaG91Z2ggaXQgaXMgc3RpbGwgYmFkIHByYWN0aWNlIHRvCmFsbG93IHRoaXMgZm9ybWF0LCB3ZSBjYW5ub3QgaGVscCB0aGVyZSBhcmUgc29tZSB2ZW5kb3JzIHRoYXQgbWFrZQp0aGVpciBhcHBsaWNhdGlvbnMgc3BpdCBvdXQgbGluZXMgc3R5bGVkIGxpa2UgdGhpcy4KCkluIGNhc2UgdGhlcmUgaXMgQjxyZWFsbHk+IGJhZCBDU1YgZGF0YSwgbGlrZQoKIDEsImZvbyAiYmFyIiBiYXoiLDQyCgpvcgoKIDEsIiJmb28gYmFyIGJheiIiLDQyCgp0aGVyZSBpcyBhIHdheSB0byBnZXQgdGhhdCBwYXJzZWQsIGFuZCBsZWF2ZSB0aGUgcXVvdGVzIGluc2lkZSB0aGUgcXVvdGVkCmZpZWxkIGFzLWlzLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSBzZXR0aW5nIEM8YWxsb3dfbG9vc2VfcXVvdGVzPiBCPEFORD4KbWFraW5nIHN1cmUgdGhhdCB0aGUgQzxlc2NhcGVfY2hhcj4gaXMgSTxub3Q+IGVxdWFsIHRvIEM8cXVvdGVfY2hhcj4uCgo9aXRlbSBlc2NhcGVfY2hhcgoKVGhlIGNoYXJhY3RlciB1c2VkIGZvciBlc2NhcGluZyBjZXJ0YWluIGNoYXJhY3RlcnMgaW5zaWRlIHF1b3RlZCBmaWVsZHMuCkxpbWl0ZWQgdG8gYSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIsIHVzdWFsbHkgaW4gdGhlIHJhbmdlIGZyb20gMHgyMAooc3BhY2UpIHRvIDB4N2UgKHRpbGRlKS4KClRoZSBDPGVzY2FwZV9jaGFyPiBkZWZhdWx0cyB0byBiZWluZyB0aGUgbGl0ZXJhbCBkb3VibGUtcXVvdGUgbWFyayAoQzwiPikKaW4gb3RoZXIgd29yZHMsIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IEM8cXVvdGVfY2hhcj4uIFRoaXMgbWVhbnMgdGhhdApkb3VibGluZyB0aGUgcXVvdGUgbWFyayBpbiBhIGZpZWxkIGVzY2FwZXMgaXQ6CgogICJmb28iLCJiYXIiLCJFc2NhcGUgIiJxdW90ZSBtYXJrIiIgd2l0aCB0d28gIiJxdW90ZSBtYXJrcyIiIiwiYmF6IgoKSWYgeW91IGNoYW5nZSB0aGUgZGVmYXVsdCBxdW90ZV9jaGFyIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGRlZmF1bHQKZXNjYXBlX2NoYXIsIHRoZSBlc2NhcGVfY2hhciB3aWxsIHN0aWxsIGJlIHRoZSBxdW90ZSBtYXJrLiAgSWYgaW5zdGVhZCAKeW91IHdhbnQgdG8gZXNjYXBlIHRoZSBxdW90ZV9jaGFyIGJ5IGRvdWJsaW5nIGl0LCB5b3Ugd2lsbCBuZWVkIHRvIGNoYW5nZQp0aGUgZXNjYXBlX2NoYXIgdG8gYmUgdGhlIHNhbWUgYXMgd2hhdCB5b3UgY2hhbmdlZCB0aGUgcXVvdGVfY2hhciB0by4KClRoZSBlc2NhcGUgY2hhcmFjdGVyIGNhbiBub3QgYmUgZXF1YWwgdG8gdGhlIHNlcGFyYXRpb24gY2hhcmFjdGVyLgoKPWl0ZW0gYWxsb3dfbG9vc2VfZXNjYXBlcwoKQnkgZGVmYXVsdCwgcGFyc2luZyBmaWVsZHMgdGhhdCBoYXZlIEM8ZXNjYXBlX2NoYXI+IGNoYXJhY3RlcnMgdGhhdAplc2NhcGUgY2hhcmFjdGVycyB0aGF0IGRvIG5vdCBuZWVkIHRvIGJlIGVzY2FwZWQsIGxpa2U6CgogbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IGVzY2FwZV9jaGFyID0+ICJcXCIgfSk7CiAkY3N2LT5wYXJzZSAocXF7MSwibXkgYmFyXCdzIixiYXosNDJ9KTsKCndvdWxkIHJlc3VsdCBpbiBhIHBhcnNlIGVycm9yLiBUaG91Z2ggaXQgaXMgc3RpbGwgYmFkIHByYWN0aWNlIHRvCmFsbG93IHRoaXMgZm9ybWF0LCB0aGlzIG9wdGlvbiBlbmFibGVzIHlvdSB0byB0cmVhdCBhbGwgZXNjYXBlIGNoYXJhY3RlcgpzZXF1ZW5jZXMgZXF1YWwuCgo9aXRlbSBiaW5hcnkKCklmIHRoaXMgYXR0cmlidXRlIGlzIFRSVUUsIHlvdSBtYXkgdXNlIGJpbmFyeSBjaGFyYWN0ZXJzIGluIHF1b3RlZCBmaWVsZHMsCmluY2x1ZGluZyBsaW5lIGZlZWRzLCBjYXJyaWFnZSByZXR1cm5zIGFuZCBOVUxMIGJ5dGVzLiAoVGhlIGxhdHRlciBtdXN0CmJlIGVzY2FwZWQgYXMgQzwiMD4uKSBCeSBkZWZhdWx0IHRoaXMgZmVhdHVyZSBpcyBvZmYuCgo9aXRlbSB0eXBlcwoKQSBzZXQgb2YgY29sdW1uIHR5cGVzOyB0aGlzIGF0dHJpYnV0ZSBpcyBpbW1lZGlhdGVseSBwYXNzZWQgdG8gdGhlCkk8dHlwZXM+IG1ldGhvZCBiZWxvdy4gWW91IG11c3Qgbm90IHNldCB0aGlzIGF0dHJpYnV0ZSBvdGhlcndpc2UsCmV4Y2VwdCBmb3IgdXNpbmcgdGhlIEk8dHlwZXM+IG1ldGhvZC4gRm9yIGRldGFpbHMgc2VlIHRoZSBkZXNjcmlwdGlvbgpvZiB0aGUgSTx0eXBlcz4gbWV0aG9kIGJlbG93LgoKPWl0ZW0gYWx3YXlzX3F1b3RlCgpCeSBkZWZhdWx0IHRoZSBnZW5lcmF0ZWQgZmllbGRzIGFyZSBxdW90ZWQgb25seSwgaWYgdGhleSBuZWVkIHRvLCBmb3IKZXhhbXBsZSwgaWYgdGhleSBjb250YWluIHRoZSBzZXBhcmF0b3IuIElmIHlvdSBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8KYSBUUlVFIHZhbHVlLCB0aGVuIGFsbCBmaWVsZHMgd2lsbCBiZSBxdW90ZWQuIFRoaXMgaXMgdHlwaWNhbGx5IGVhc2llcgp0byBoYW5kbGUgaW4gZXh0ZXJuYWwgYXBwbGljYXRpb25zLgoKPWl0ZW0ga2VlcF9tZXRhX2luZm8KCkJ5IGRlZmF1bHQsIHRoZSBwYXJzaW5nIG9mIGlucHV0IGxpbmVzIGlzIGFzIHNpbXBsZSBhbmQgZmFzdCBhcwpwb3NzaWJsZS4gSG93ZXZlciwgc29tZSBwYXJzaW5nIGluZm9ybWF0aW9uIC0gbGlrZSBxdW90YXRpb24gb2YKdGhlIG9yaWdpbmFsIGZpZWxkIC0gaXMgbG9zdCBpbiB0aGF0IHByb2Nlc3MuIFNldCB0aGlzIGZsYWcgdG8KdHJ1ZSB0byBiZSBhYmxlIHRvIHJldHJpZXZlIHRoYXQgaW5mb3JtYXRpb24gYWZ0ZXIgcGFyc2luZyB3aXRoCnRoZSBtZXRob2RzIEM8bWV0YV9pbmZvICgpPiwgQzxpc19xdW90ZWQgKCk+LCBhbmQgQzxpc19iaW5hcnkgKCk+CmRlc2NyaWJlZCBiZWxvdy4gIERlZmF1bHQgaXMgZmFsc2UuCgo9aXRlbSB2ZXJiYXRpbQoKVGhpcyBpcyBhIHF1aXRlIGNvbnRyb3ZlcnNpYWwgYXR0cmlidXRlIHRvIHNldCwgYnV0IGl0IG1ha2VzIGhhcmQKdGhpbmdzIHBvc3NpYmxlLgoKVGhlIGJhc2ljIHRob3VnaHQgYmVoaW5kIHRoaXMgaXMgdG8gdGVsbCB0aGUgcGFyc2VyIHRoYXQgdGhlIG5vcm1hbGx5CnNwZWNpYWwgY2hhcmFjdGVycyBuZXdsaW5lIChOTCkgYW5kIENhcnJpYWdlIFJldHVybiAoQ1IpIHdpbGwgbm90IGJlCnNwZWNpYWwgd2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBhbmQgYmUgZGVhbHQgd2l0aCBhcyBiZWluZyBvcmRpbmFyeQpiaW5hcnkgY2hhcmFjdGVycy4gVGhpcyB3aWxsIGVhc2Ugd29ya2luZyB3aXRoIGRhdGEgd2l0aCBlbWJlZGRlZApuZXdsaW5lcy4KCldoZW4gQzx2ZXJiYXRpbT4gaXMgdXNlZCB3aXRoIEM8Z2V0bGluZSAoKT4sIGdldGxpbmUKYXV0by1jaG9tcCdzIGV2ZXJ5IGxpbmUuCgpJbWFnaW5lIGEgZmlsZSBmb3JtYXQgbGlrZQoKICBNXl5IYW5zXkphbnNzZW5eS2xhcyAyXG4yQV5KYV4xMS0wNi0yMDA3I1xyXG4KCndoZXJlLCB0aGUgbGluZSBlbmRpbmcgaXMgYSB2ZXJ5IHNwZWNpZmljICIjXHJcbiIsIGFuZCB0aGUgc2VwX2NoYXIKaXMgYSBeIChjYXJldCkuIE5vbmUgb2YgdGhlIGZpZWxkcyBpcyBxdW90ZWQsIGJ1dCBlbWJlZGRlZCBiaW5hcnkKZGF0YSBpcyBsaWtlbHkgdG8gYmUgcHJlc2VudC4gV2l0aCB0aGUgc3BlY2lmaWMgbGluZSBlbmRpbmcsIHRoYXQKc2hvdWxkbid0IGJlIHRvbyBoYXJkIHRvIGRldGVjdC4KCkJ5IGRlZmF1bHQsIFRleHQ6OkNTVl9QUCcgcGFyc2UgZnVuY3Rpb24gaG93ZXZlciBpcyBpbnN0cnVjdGVkIHRvIG9ubHkKa25vdyBhYm91dCAiXG4iIGFuZCAiXHIiIHRvIGJlIGxlZ2FsIGxpbmUgZW5kaW5ncywgYW5kIHNvIGhhcyB0byBkZWFsCndpdGggdGhlIGVtYmVkZGVkIG5ld2xpbmUgYXMgYSByZWFsIGVuZC1vZi1saW5lLCBzbyBpdCBjYW4gc2NhbiB0aGUgbmV4dApsaW5lIGlmIGJpbmFyeSBpcyB0cnVlLCBhbmQgdGhlIG5ld2xpbmUgaXMgaW5zaWRlIGEgcXVvdGVkIGZpZWxkLgpXaXRoIHRoaXMgYXR0cmlidXRlIGhvd2V2ZXIsIHdlIGNhbiB0ZWxsIHBhcnNlICgpIHRvIHBhcnNlIHRoZSBsaW5lCmFzIGlmIFxuIGlzIGp1c3Qgbm90aGluZyBtb3JlIHRoYW4gYSBiaW5hcnkgY2hhcmFjdGVyLgoKRm9yIHBhcnNlICgpIHRoaXMgbWVhbnMgdGhhdCB0aGUgcGFyc2VyIGhhcyBubyBpZGVhIGFib3V0IGxpbmUgZW5kaW5nCmFueW1vcmUsIGFuZCBnZXRsaW5lICgpIGNob21wcyBsaW5lIGVuZGluZ3Mgb24gcmVhZGluZy4KCj1iYWNrCgpUbyBzdW0gaXQgdXAsCgogJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICgpOwoKaXMgZXF1aXZhbGVudCB0bwoKICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoewogICAgIHF1b3RlX2NoYXIgICAgICAgICAgPT4gJyInLAogICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgIHNlcF9jaGFyICAgICAgICAgICAgPT4gJywnLAogICAgIGVvbCAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgYWx3YXlzX3F1b3RlICAgICAgICA9PiAwLAogICAgIGJpbmFyeSAgICAgICAgICAgICAgPT4gMCwKICAgICBrZWVwX21ldGFfaW5mbyAgICAgID0+IDAsCiAgICAgYWxsb3dfbG9vc2VfcXVvdGVzICA9PiAwLAogICAgIGFsbG93X2xvb3NlX2VzY2FwZXMgPT4gMCwKICAgICBhbGxvd193aGl0ZXNwYWNlICAgID0+IDAsCiAgICAgYmxhbmtfaXNfdW5kZWYgICAgICA9PiAwLAogICAgIHZlcmJhdGltICAgICAgICAgICAgPT4gMCwKICAgICB9KTsKCkZvciBhbGwgb2YgdGhlIGFib3ZlIG1lbnRpb25lZCBmbGFncywgdGhlcmUgaXMgYW4gYWNjZXNzb3IgbWV0aG9kCmF2YWlsYWJsZSB3aGVyZSB5b3UgY2FuIGlucXVpcmUgZm9yIHRoZSBjdXJyZW50IHZhbHVlLCBvciBjaGFuZ2UKdGhlIHZhbHVlCgogbXkgJHF1b3RlID0gJGNzdi0+cXVvdGVfY2hhcjsKICRjc3YtPmJpbmFyeSAoMSk7CgpJdCBpcyB1bndpc2UgdG8gY2hhbmdlIHRoZXNlIHNldHRpbmdzIGhhbGZ3YXkgdGhyb3VnaCB3cml0aW5nIENTVgpkYXRhIHRvIGEgc3RyZWFtLiBJZiBob3dldmVyLCB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgc3RyZWFtIHVzaW5nCnRoZSBhdmFpbGFibGUgQ1NWIG9iamVjdCwgdGhlcmUgaXMgbm8gaGFybSBpbiBjaGFuZ2luZyB0aGVtLgoKSWYgdGhlIEM8bmV3ICgpPiBjb25zdHJ1Y3RvciBjYWxsIGZhaWxzLCBpdCByZXR1cm5zIEM8dW5kZWY+LCBhbmQgbWFrZXMKdGhlIGZhaWwgcmVhc29uIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBDPGVycm9yX2RpYWcgKCk+IG1ldGhvZC4KCiAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgZWNzX2NoYXIgPT4gMSB9KSBvcgogICAgIGRpZSBUZXh0OjpDU1ZfUFAtPmVycm9yX2RpYWcgKCk7CgpDPGVycm9yX2RpYWcgKCk+IHdpbGwgcmV0dXJuIGEgc3RyaW5nIGxpa2UKCiAiVW5rbm93biBhdHRyaWJ1dGUgJ2Vjc19jaGFyJyIKCj1oZWFkMiBjb21iaW5lCgogJHN0YXR1cyA9ICRjc3YtPmNvbWJpbmUgKEBjb2x1bW5zKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIGNvbnN0cnVjdHMgYSBDU1Ygc3RyaW5nIGZyb20gdGhlIGFyZ3VtZW50cywgcmV0dXJuaW5nCnN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEZhaWx1cmUgY2FuIHJlc3VsdCBmcm9tIGxhY2sgb2YgYXJndW1lbnRzIG9yIGFuIGFyZ3VtZW50CmNvbnRhaW5pbmcgYW4gaW52YWxpZCBjaGFyYWN0ZXIuICBVcG9uIHN1Y2Nlc3MsIEM8c3RyaW5nICgpPiBjYW4gYmUgY2FsbGVkIHRvCnJldHJpZXZlIHRoZSByZXN1bHRhbnQgQ1NWIHN0cmluZy4gIFVwb24gZmFpbHVyZSwgdGhlIHZhbHVlIHJldHVybmVkIGJ5CkM8c3RyaW5nICgpPiBpcyB1bmRlZmluZWQgYW5kIEM8ZXJyb3JfaW5wdXQgKCk+IGNhbiBiZSBjYWxsZWQgdG8gcmV0cmlldmUgYW4KaW52YWxpZCBhcmd1bWVudC4KCj1oZWFkMiBwcmludAoKICRzdGF0dXMgPSAkY3N2LT5wcmludCAoJGlvLCAkY29scmVmKTsKClNpbWlsYXIgdG8gY29tYmluZSwgYnV0IGl0IGV4cGVjdHMgYW4gYXJyYXkgcmVmIGFzIGlucHV0IChub3QgYW4gYXJyYXkhKQphbmQgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgbm90IHJlYWxseSBjcmVhdGVkLCBidXQgaW1tZWRpYXRlbHkgd3JpdHRlbgp0byB0aGUgSTwkaW8+IG9iamVjdCwgdHlwaWNhbGx5IGFuIElPIGhhbmRsZSBvciBhbnkgb3RoZXIgb2JqZWN0IHRoYXQKb2ZmZXJzIGEgSTxwcmludD4gbWV0aG9kLiBOb3RlLCB0aGlzIGltcGxpZXMgdGhhdCB0aGUgZm9sbG93aW5nIGlzIHdyb25nOgoKIG9wZW4gRklMRSwgIj4iLCAid2hhdGV2ZXIiOwogJHN0YXR1cyA9ICRjc3YtPnByaW50IChcKkZJTEUsICRjb2xyZWYpOwoKVGhlIGdsb2IgQzxcKkZJTEU+IGlzIG5vdCBhbiBvYmplY3QsIHRodXMgaXQgZG9lc24ndCBoYXZlIGEgcHJpbnQKbWV0aG9kLiBUaGUgc29sdXRpb24gaXMgdG8gdXNlIGFuIElPOjpGaWxlIG9iamVjdCBvciB0byBoaWRlIHRoZQpnbG9iIGJlaGluZCBhbiBJTzo6V3JhcCBvYmplY3QuIFNlZSBMPElPOjpGaWxlKDMpPiBhbmQgTDxJTzo6V3JhcCgzKT4KZm9yIGRldGFpbHMuCgpGb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGUgcHJpbnQgbWV0aG9kIGRvZXNuJ3QgY3JlYXRlIGEgcmVzdWx0IHN0cmluZy4KSW4gcGFydGljdWxhciB0aGUgSTwkY3N2LUU8Z3Q+c3RyaW5nICgpPiwgSTwkY3N2LUU8Z3Q+c3RhdHVzICgpPiwKSTwkY3N2LT5maWVsZHMgKCk+IGFuZCBJPCRjc3YtRTxndD5lcnJvcl9pbnB1dCAoKT4gbWV0aG9kcyBhcmUgbWVhbmluZ2xlc3MKYWZ0ZXIgZXhlY3V0aW5nIHRoaXMgbWV0aG9kLgoKPWhlYWQyIHN0cmluZwoKICRsaW5lID0gJGNzdi0+c3RyaW5nICgpOwoKVGhpcyBvYmplY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5wdXQgdG8gQzxwYXJzZSAoKT4gb3IgdGhlIHJlc3VsdGFudCBDU1YKc3RyaW5nIG9mIEM8Y29tYmluZSAoKT4sIHdoaWNoZXZlciB3YXMgY2FsbGVkIG1vcmUgcmVjZW50bHkuCgo9aGVhZDIgcGFyc2UKCiAkc3RhdHVzID0gJGNzdi0+cGFyc2UgKCRsaW5lKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIGRlY29tcG9zZXMgYSBDU1Ygc3RyaW5nIGludG8gZmllbGRzLCByZXR1cm5pbmcKc3VjY2VzcyBvciBmYWlsdXJlLiAgRmFpbHVyZSBjYW4gcmVzdWx0IGZyb20gYSBsYWNrIG9mIGFyZ3VtZW50IG9yIHRoZQpnaXZlbiBDU1Ygc3RyaW5nIGlzIGltcHJvcGVybHkgZm9ybWF0dGVkLiAgVXBvbiBzdWNjZXNzLCBDPGZpZWxkcyAoKT4gY2FuCmJlIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgZGVjb21wb3NlZCBmaWVsZHMgLiAgVXBvbiBmYWlsdXJlLCB0aGUgdmFsdWUKcmV0dXJuZWQgYnkgQzxmaWVsZHMgKCk+IGlzIHVuZGVmaW5lZCBhbmQgQzxlcnJvcl9pbnB1dCAoKT4gY2FuIGJlIGNhbGxlZAp0byByZXRyaWV2ZSB0aGUgaW52YWxpZCBhcmd1bWVudC4KCllvdSBtYXkgdXNlIHRoZSBJPHR5cGVzICgpPiBtZXRob2QgZm9yIHNldHRpbmcgY29sdW1uIHR5cGVzLiBTZWUgdGhlCmRlc2NyaXB0aW9uIGJlbG93LgoKPWhlYWQyIGdldGxpbmUKCiAkY29scmVmID0gJGNzdi0+Z2V0bGluZSAoJGlvKTsKClRoaXMgaXMgdGhlIGNvdW50ZXJwYXJ0IHRvIHByaW50LCBsaWtlIHBhcnNlIGlzIHRoZSBjb3VudGVycGFydCB0bwpjb21iaW5lOiBJdCByZWFkcyBhIHJvdyBmcm9tIHRoZSBJTyBvYmplY3QgJGlvIHVzaW5nICRpby0+Z2V0bGluZSAoKQphbmQgcGFyc2VzIHRoaXMgcm93IGludG8gYW4gYXJyYXkgcmVmLiBUaGlzIGFycmF5IHJlZiBpcyByZXR1cm5lZApieSB0aGUgZnVuY3Rpb24gb3IgdW5kZWYgZm9yIGZhaWx1cmUuCgpXaGVuIGZpZWxkcyBhcmUgYm91bmQgd2l0aCBDPGJpbmRfY29sdW1ucyAoKT4sIHRoZSByZXR1cm4gdmFsdWUgaXMgYQpyZWZlcmVuY2UgdG8gYW4gZW1wdHkgbGlzdC4KClRoZSBJPCRjc3YtRTxndD5zdHJpbmcgKCk+LCBJPCRjc3YtRTxndD5maWVsZHMgKCk+IGFuZCBJPCRjc3YtRTxndD5zdGF0dXMgKCk+Cm1ldGhvZHMgYXJlIG1lYW5pbmdsZXNzLCBhZ2Fpbi4KCj1oZWFkMiBnZXRsaW5lX2hyCgpUaGUgQzxnZXRsaW5lX2hyICgpPiBhbmQgQzxjb2x1bW5fbmFtZXMgKCk+IG1ldGhvZHMgd29yayB0b2dldGhlciB0byBhbGxvdwp5b3UgdG8gaGF2ZSByb3dzIHJldHVybmVkIGFzIGhhc2hyZWZzLiBZb3UgbXVzdCBjYWxsIEM8Y29sdW1uX25hbWVzICgpPgpmaXJzdCB0byBkZWNsYXJlIHlvdXIgY29sdW1uIG5hbWVzLiAKCiAkY3N2LT5jb2x1bW5fbmFtZXMgKHF3KCBjb2RlIG5hbWUgcHJpY2UgZGVzY3JpcHRpb24gKSk7CiAkaHIgPSAkY3N2LT5nZXRsaW5lX2hyICgkaW8pOwogcHJpbnQgIlByaWNlIGZvciAkaHItPntuYW1lfSBpcyAkaHItPntwcmljZX0gRVVSXG4iOwoKQzxnZXRsaW5lX2hyICgpPiB3aWxsIGNyb2FrIGlmIGNhbGxlZCBiZWZvcmUgQzxjb2x1bW5fbmFtZXMgKCk+LgoKPWhlYWQyIGNvbHVtbl9uYW1lcwoKU2V0IHRoZSBrZXlzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBDPGdldGxpbmVfaHIgKCk+IGNhbGxzLiBJZiBubyBrZXlzCihjb2x1bW4gbmFtZXMpIGFyZSBwYXNzZWQsIGl0J2xsIHJldHVybiB0aGUgY3VycmVudCBzZXR0aW5nLgoKQzxjb2x1bW5fbmFtZXMgKCk+IGFjY2VwdHMgYSBsaXN0IG9mIHNjYWxhcnMgKHRoZSBjb2x1bW4gbmFtZXMpIG9yIGEKc2luZ2xlIGFycmF5X3JlZiwgc28geW91IGNhbiBwYXNzIEM8Z2V0bGluZSAoKT4KCiAgJGNzdi0+Y29sdW1uX25hbWVzICgkY3N2LT5nZXRsaW5lICgkaW8pKTsKCkM8Y29sdW1uX25hbWVzICgpPiBjcm9ha3Mgb24gaW52YWxpZCBhcmd1bWVudHMuCgo9aGVhZDIgYmluZF9jb2x1bW5zCgpUYWtlcyBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byBzY2FsYXJzIChtYXggMjU1KSB0byBzdG9yZSB0aGUgZmllbGRzIGZldGNoZWQKQzxnZXRsaW5lICgpPiBpbi4gV2hlbiB5b3UgZG9uJ3QgcGFzcyBlbm91Z2ggcmVmZXJlbmNlcyB0byBzdG9yZSB0aGUKZmV0Y2hlZCBmaWVsZHMgaW4sIEM8Z2V0bGluZSAoKT4gd2lsbCBmYWlsLiBJZiB5b3UgcGFzcyBtb3JlIHRoYW4gdGhlcmUgYXJlCmZpZWxkcyB0byByZXR1cm4sIHRoZSByZW1haW5pbmcgcmVmZXJlbmNlcyBhcmUgbGVmdCB1bnRvdWNoZWQuCgogICRjc3YtPmJpbmRfY29sdW1ucyAoXCRjb2RlLCBcJG5hbWUsIFwkcHJpY2UsIFwkZGVzY3JpcHRpb24pOwogIHdoaWxlICgkY3N2LT5nZXRsaW5lICgpKSB7CiAgICAgIHByaW50ICJUaGUgcHJpY2Ugb2YgYSAkbmFtZSBpcyBceHsyMGFjfSAkcHJpY2VcbiI7CiAgICAgIH0KCj1oZWFkMiBlb2YKCiAkZW9mID0gJGNzdi0+ZW9mICgpOwoKSWYgQzxwYXJzZSAoKT4gb3IgQzxnZXRsaW5lICgpPiB3YXMgdXNlZCB3aXRoIGFuIElPIHN0cmVhbSwgdGhpcwptZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZSAoMSkgaWYgdGhlIGxhc3QgY2FsbCBoaXQgZW5kIG9mIGZpbGUsIG90aGVyd2lzZQppdCB3aWxsIHJldHVybiBmYWxzZSAoJycpLiBUaGlzIGlzIHVzZWZ1bCB0byBzZWUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgphIGZhaWx1cmUgYW5kIGVuZCBvZiBmaWxlLgoKPWhlYWQyIHR5cGVzCgogJGNzdi0+dHlwZXMgKFxAdHJlZik7CgpUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGZvcmNlIHRoYXQgY29sdW1ucyBhcmUgb2YgYSBnaXZlbiB0eXBlLiBGb3IKZXhhbXBsZSwgaWYgeW91IGhhdmUgYW4gaW50ZWdlciBjb2x1bW4sIHR3byBkb3VibGUgY29sdW1ucyBhbmQgYQpzdHJpbmcgY29sdW1uLCB0aGVuIHlvdSBtaWdodCBkbyBhCgogJGNzdi0+dHlwZXMgKFtUZXh0OjpDU1ZfUFA6OklWICgpLAogICAgICAgICAgICAgICBUZXh0OjpDU1ZfUFA6Ok5WICgpLAogICAgICAgICAgICAgICBUZXh0OjpDU1ZfUFA6Ok5WICgpLAogICAgICAgICAgICAgICBUZXh0OjpDU1ZfUFA6OlBWICgpXSk7CgpDb2x1bW4gdHlwZXMgYXJlIHVzZWQgb25seSBmb3IgZGVjb2RpbmcgY29sdW1ucywgaW4gb3RoZXIgd29yZHMKYnkgdGhlIEk8cGFyc2UgKCk+IGFuZCBJPGdldGxpbmUgKCk+IG1ldGhvZHMuCgpZb3UgY2FuIHVuc2V0IGNvbHVtbiB0eXBlcyBieSBkb2luZyBhCgogJGNzdi0+dHlwZXMgKHVuZGVmKTsKCm9yIGZldGNoIHRoZSBjdXJyZW50IHR5cGUgc2V0dGluZ3Mgd2l0aAoKICR0eXBlcyA9ICRjc3YtPnR5cGVzICgpOwoKPW92ZXIgNAoKPWl0ZW0gSVYKClNldCBmaWVsZCB0eXBlIHRvIGludGVnZXIuCgo9aXRlbSBOVgoKU2V0IGZpZWxkIHR5cGUgdG8gbnVtZXJpYy9mbG9hdC4KCj1pdGVtIFBWCgpTZXQgZmllbGQgdHlwZSB0byBzdHJpbmcuCgo9YmFjawoKPWhlYWQyIGZpZWxkcwoKIEBjb2x1bW5zID0gJGNzdi0+ZmllbGRzICgpOwoKVGhpcyBvYmplY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5wdXQgdG8gQzxjb21iaW5lICgpPiBvciB0aGUgcmVzdWx0YW50CmRlY29tcG9zZWQgZmllbGRzIG9mIEM8cGFyc2UgKCk+LCB3aGljaGV2ZXIgd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgoKPWhlYWQyIG1ldGFfaW5mbwoKIEBmbGFncyA9ICRjc3YtPm1ldGFfaW5mbyAoKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIGZsYWdzIG9mIHRoZSBpbnB1dCB0byBDPGNvbWJpbmUgKCk+IG9yCnRoZSBmbGFncyBvZiB0aGUgcmVzdWx0YW50IGRlY29tcG9zZWQgZmllbGRzIG9mIEM8cGFyc2UgKCk+LCB3aGljaGV2ZXIKd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgoKRm9yIGVhY2ggZmllbGQsIGEgbWV0YV9pbmZvIGZpZWxkIHdpbGwgaG9sZCBmbGFncyB0aGF0IHRlbGwgc29tZXRoaW5nIGFib3V0CnRoZSBmaWVsZCByZXR1cm5lZCBieSB0aGUgQzxmaWVsZHMgKCk+IG1ldGhvZCBvciBwYXNzZWQgdG8gdGhlIEM8Y29tYmluZSAoKT4KbWV0aG9kLiBUaGUgZmxhZ3MgYXJlIGJpdHdpc2Utb3InZCBsaWtlOgoKPW92ZXIgNAoKPWl0ZW0gMHgwMDAxCgpUaGUgZmllbGQgd2FzIHF1b3RlZC4KCj1pdGVtIDB4MDAwMgoKVGhlIGZpZWxkIHdhcyBiaW5hcnkuCgo9YmFjawoKU2VlIHRoZSBDPGlzXyoqKiAoKT4gbWV0aG9kcyBiZWxvdy4KCj1oZWFkMiBpc19xdW90ZWQKCiAgbXkgJHF1b3RlZCA9ICRjc3YtPmlzX3F1b3RlZCAoJGNvbHVtbl9pZHgpOwoKV2hlcmUgQzwkY29sdW1uX2lkeD4gaXMgdGhlICh6ZXJvLWJhc2VkKSBpbmRleCBvZiB0aGUgY29sdW1uIGluIHRoZQpsYXN0IHJlc3VsdCBvZiBDPHBhcnNlICgpPi4KClRoaXMgcmV0dXJucyBhIHRydWUgdmFsdWUgaWYgdGhlIGRhdGEgaW4gdGhlIGluZGljYXRlZCBjb2x1bW4gd2FzCmVuY2xvc2VkIGluIEM8cXVvdGVfY2hhcj4gcXVvdGVzLiBUaGlzIG1pZ2h0IGJlIGltcG9ydGFudCBmb3IgZGF0YQp3aGVyZSBDPCwyMDA3MDEwOCw+IGlzIHRvIGJlIHRyZWF0ZWQgYXMgYSBudW1lcmljIHZhbHVlLCBhbmQgd2hlcmUKQzwsIjIwMDcwMTA4Iiw+IGlzIGV4cGxpY2l0bHkgbWFya2VkIGFzIGNoYXJhY3RlciBzdHJpbmcgZGF0YS4KCj1oZWFkMiBpc19iaW5hcnkKCiAgbXkgJGJpbmFyeSA9ICRjc3YtPmlzX2JpbmFyeSAoJGNvbHVtbl9pZHgpOwoKV2hlcmUgQzwkY29sdW1uX2lkeD4gaXMgdGhlICh6ZXJvLWJhc2VkKSBpbmRleCBvZiB0aGUgY29sdW1uIGluIHRoZQpsYXN0IHJlc3VsdCBvZiBDPHBhcnNlICgpPi4KClRoaXMgcmV0dXJucyBhIHRydWUgdmFsdWUgaWYgdGhlIGRhdGEgaW4gdGhlIGluZGljYXRlZCBjb2x1bW4KY29udGFpbmVkIGFueSBieXRlIGluIHRoZSByYW5nZSBbXHgwMC1ceDA4LFx4MTAtXHgxRixceDdGLVx4RkZdCgo9aGVhZDIgc3RhdHVzCgogJHN0YXR1cyA9ICRjc3YtPnN0YXR1cyAoKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIHJldHVybnMgc3VjY2VzcyAob3IgZmFpbHVyZSkgb2YgQzxjb21iaW5lICgpPiBvcgpDPHBhcnNlICgpPiwgd2hpY2hldmVyIHdhcyBjYWxsZWQgbW9yZSByZWNlbnRseS4KCj1oZWFkMiBlcnJvcl9pbnB1dAoKICRiYWRfYXJndW1lbnQgPSAkY3N2LT5lcnJvcl9pbnB1dCAoKTsKClRoaXMgb2JqZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIGVycm9uZW91cyBhcmd1bWVudCAoaWYgaXQgZXhpc3RzKSBvZgpDPGNvbWJpbmUgKCk+IG9yIEM8cGFyc2UgKCk+LCB3aGljaGV2ZXIgd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgoKPWhlYWQyIGVycm9yX2RpYWcKCiAkY3N2LT5lcnJvcl9kaWFnICgpOwogJGVycm9yX2NvZGUgICA9IDAgICsgJGNzdi0+ZXJyb3JfZGlhZyAoKTsKICRlcnJvcl9zdHIgICAgPSAiIiAuICRjc3YtPmVycm9yX2RpYWcgKCk7CiAoJGNkZSwgJHN0ciwgJHBvcykgPSAkY3N2LT5lcnJvcl9kaWFnICgpOwoKSWYgKGFuZCBvbmx5IGlmKSBhbiBlcnJvciBvY2N1cmVkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRpYWdub3N0aWNzCm9mIHRoYXQgZXJyb3IuCgpJZiBjYWxsZWQgaW4gdm9pZCBjb250ZXh0LCBpdCB3aWxsIHByaW50IHRoZSBpbnRlcm5hbCBlcnJvciBjb2RlIGFuZCB0aGUKYXNzb2NpYXRlZCBlcnJvciBtZXNzYWdlIHRvIFNUREVSUi4KCklmIGNhbGxlZCBpbiBsaXN0IGNvbnRleHQsIGl0IHdpbGwgcmV0dXJuIHRoZSBlcnJvciBjb2RlIGFuZCB0aGUgZXJyb3IKbWVzc2FnZSBpbiB0aGF0IG9yZGVyLiBJZiB0aGUgbGFzdCBlcnJvciB3YXMgZnJvbSBwYXJzaW5nLCB0aGUgdGhpcmQKdmFsdWUgcmV0dXJuZWQgaXMgdGhlIGJlc3QgZ3Vlc3MgYXQgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgbGluZSB0aGF0IHdhcwpiZWluZyBwYXJzZWQuIEl0J3MgdmFsdWUgaXMgMS1iYXNlZC4KCk5vdGU6IEM8JHBvcz4gZG9lcyBub3Qgc2hvdyB0aGUgZXJyb3IgcG9pbnQgaW4gbWFueSBjYXNlcy4KSXQgaXMgZm9yIGNvbnNjaWVuY2UncyBzYWtlLgoKSWYgY2FsbGVkIGluIHNjYWxhciBjb250ZXh0LCBpdCB3aWxsIHJldHVybiB0aGUgZGlhZ25vc3RpY3MgaW4gYSBzaW5nbGUKc2NhbGFyLCBhLWxhICQhLiBJdCB3aWxsIGNvbnRhaW4gdGhlIGVycm9yIGNvZGUgaW4gbnVtZXJpYyBjb250ZXh0LCBhbmQKdGhlIGRpYWdub3N0aWNzIG1lc3NhZ2UgaW4gc3RyaW5nIGNvbnRleHQuCgpUbyBhY2hpZXZlIHRoaXMgYmVoYXZpb3Igd2l0aCBDU1ZfUFAsIHRoZSByZXR1cm5lZCBkaWFnbm9zdGljcyBpcyBibGVzc2VkIG9iamVjdC4KCj1oZWFkMiBTZXREaWFnCgogJGNzdi0+U2V0RGlhZyAoMCk7CgpVc2UgdG8gcmVzZXQgdGhlIGRpYWdub3N0aWNzIGlmIHlvdSBhcmUgZGVhbGluZyB3aXRoIGVycm9ycy4KCj1oZWFkMSBESUFHTk9TVElDUwoKSWYgYW4gZXJyb3Igb2NjdXJlZCwgJGNzdi0+ZXJyb3JfZGlhZyAoKSBjYW4gYmUgdXNlZCB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbgpvbiB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUuIE5vdGUgdGhhdCBmb3Igc3BlZWQgcmVhc29ucywgdGhlIGludGVybmFsIHZhbHVlCmlzIG5ldmVyIGNsZWFyZWQgb24gc3VjY2Vzcywgc28gdXNpbmcgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGVycm9yX2RpYWcgKCkgaW4Kbm9ybWFsIGNhc2VzIC0gd2hlbiBubyBlcnJvciBvY2N1cmVkIC0gbWF5IGNhdXNlIHVuZXhwZWN0ZWQgcmVzdWx0cy4KCk5vdGU6IENTVl9QUCdzIGRpYWdub3N0aWNzIGlzIGRpZmZlcmVudCBmcm9tIENTVl9YUydzOgoKVGV4dDo6Q1NWX1hTIHBhcnNlcyBjc3Ygc3RyaW5ncyBieSBkaXZpZGluZyBvbmUgY2hhcmFjdGVyCndoaWxlIFRleHQ6OkNTVl9QUCBieSB1c2luZyB0aGUgcmVndWxhciBleHByZXNzaW9ucy4KVGhhdCBkaWZmZXJlbmNlIG1ha2VzIHRoZSBkaWZmZXJlbnQgY2F1c2Ugb2YgdGhlIGZhaWx1cmUuCgpDdXJyZW50bHkgdGhlc2UgZXJyb3JzIGFyZSBhdmFpbGFibGU6Cgo9b3ZlciAyCgo9aXRlbSAxMDAxICJzZXBfY2hhciBpcyBlcXVhbCB0byBxdW90ZV9jaGFyIG9yIGVzY2FwZV9jaGFyIgoKVGhlIHNlcGFyYXRpb24gY2hhcmFjdGVyIGNhbm5vdCBiZSBlcXVhbCB0byBlaXRoZXIgdGhlIHF1b3RhdGlvbiBjaGFyYWN0ZXIKb3IgdGhlIGVzY2FwZSBjaGFyYWN0ZXIsIGFzIHRoYXQgd2lsbCBpbnZhbGlkYXRlIGFsbCBwYXJzaW5nIHJ1bGVzLgoKPWl0ZW0gMjAxMCAiRUNSIC0gUVVPIGNoYXIgaW5zaWRlIHF1b3RlcyBmb2xsb3dlZCBieSBDUiBub3QgcGFydCBvZiBFT0wiCgo9aXRlbSAyMDExICJFQ1IgLSBDaGFyYWN0ZXJzIGFmdGVyIGVuZCBvZiBxdW90ZWQgZmllbGQiCgo9aXRlbSAyMDIxICJFSVEgLSBOTCBjaGFyIGluc2lkZSBxdW90ZXMsIGJpbmFyeSBvZmYiCgo9aXRlbSAyMDIyICJFSVEgLSBDUiBjaGFyIGluc2lkZSBxdW90ZXMsIGJpbmFyeSBvZmYiCgo9aXRlbSAyMDI1ICJFSVEgLSBMb29zZSB1bmVzY2FwZWQgZXNjYXBlIgoKPWl0ZW0gMjAyNiAiRUlRIC0gQmluYXJ5IGNoYXJhY3RlciBpbnNpZGUgcXVvdGVkIGZpZWxkLCBiaW5hcnkgb2ZmIgoKPWl0ZW0gMjAyNyAiRUlRIC0gUXVvdGVkIGZpZWxkIG5vdCB0ZXJtaW5hdGVkIgoKPWl0ZW0gMjAzMCAiRUlGIC0gTkwgY2hhciBpbnNpZGUgdW5xdW90ZWQgdmVyYmF0aW0sIGJpbmFyeSBvZmYiLAoKPWl0ZW0gMjAzMSAiRUlGIC0gQ1IgY2hhciBpcyBmaXJzdCBjaGFyIG9mIGZpZWxkLCBub3QgcGFydCBvZiBFT0wiLAoKPWl0ZW0gMjAzMiAiRUlGIC0gQ1IgY2hhciBpbnNpZGUgdW5xdW90ZWQsIG5vdCBwYXJ0IG9mIEVPTCIsCgo9aXRlbSAyMDM0ICJFSUYgLSBMb29zZSB1bmVzY2FwZWQgcXVvdGUiLAoKPWl0ZW0gMjAzNyAiRUlGIC0gQmluYXJ5IGNoYXJhY3RlciBpbiB1bnF1b3RlZCBmaWVsZCwgYmluYXJ5IG9mZiIsCgo9aXRlbSAyMTEwICJFQ0IgLSBCaW5hcnkgY2hhcmFjdGVyIGluIENvbWJpbmUsIGJpbmFyeSBvZmYiCgo9aXRlbSA0MDAyICJFSVEgLSBVbmVzY2FwZWQgRVNDIGluIHF1b3RlZCBmaWVsZCIKCj1pdGVtIDQwMDMgIkVJRiAtIEVTQyBDUiIKCj1pdGVtIDQwMDQgIkVVRiAtICIKCj1pdGVtIDMwMDEgIkVIUiAtIFVuc3VwcG9ydGVkIHN5bnRheCBmb3IgY29sdW1uX25hbWVzICgpIgoKPWl0ZW0gMzAwMiAiRUhSIC0gZ2V0bGluZV9ociAoKSBjYWxsZWQgYmVmb3JlIGNvbHVtbl9uYW1lcyAoKSIKCj1pdGVtIDMwMDMgIkVIUiAtIGJpbmRfY29sdW1ucyAoKSBhbmQgY29sdW1uX25hbWVzICgpIGZpZWxkcyBjb3VudCBtaXNtYXRjaCIKCj1pdGVtIDMwMDQgIkVIUiAtIGJpbmRfY29sdW1ucyAoKSBvbmx5IGFjY2VwdHMgcmVmcyB0byBzY2FsYXJzIgoKPWl0ZW0gMzAwNiAiRUhSIC0gYmluZF9jb2x1bW5zICgpIGRpZCBub3QgcGFzcyBlbm91Z2ggcmVmcyBmb3IgcGFyc2VkIGZpZWxkcyIKCj1pdGVtIDMwMDcgIkVIUiAtIGJpbmRfY29sdW1ucyBuZWVkcyByZWZzIHRvIHdyaXRlYWJsZSBzY2FsYXJzIgoKPWl0ZW0gMzAwOCAiRUhSIC0gdW5leHBlY3RlZCBlcnJvciBpbiBib3VuZCBmaWVsZHMiCgo9YmFjawoKPWhlYWQxIEFVVEhPUgoKTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUsIEU8bHQ+bWFrYW1ha2FbYXRdY3Bhbi5vcmdFPGd0PgoKVGV4dDo6Q1NWX1hTIHdhcyB3cml0dGVuIGJ5IEU8bHQ+am9lW2F0XWlzcHNvZnQuZGVFPGd0PgphbmQgbWFpbnRhaW5lZCBieSBFPGx0PmgubS5icmFuZFthdF14czRhbGwubmxFPGd0Pi4KClRleHQ6OkNTViB3YXMgd3JpdHRlbiBieSBFPGx0PmFsYW5bYXRdbWZncnRsLmNvbUU8Z3Q+LgoKCj1oZWFkMSBDT1BZUklHSFQgQU5EIExJQ0VOU0UKCkNvcHlyaWdodCAyMDA1LTIwMDggYnkgTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUsIEU8bHQ+bWFrYW1ha2FbYXRdY3Bhbi5vcmdFPGd0PgoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIAoKPWhlYWQxIFNFRSBBTFNPCgpMPFRleHQ6OkNTVl9YUz4sIEw8VGV4dDo6Q1NWPgoKSSBnb3QgbWFueSByZWdleHAgYmFzZXMgZnJvbSBMPGh0dHA6Ly93d3cuZGluLm9yLmpwL35vaHpha2kvcGVybC5odG0+Cgo9Y3V0Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBJbXBvcnRFeHBvcnQueG1sLHYgMS4zIDIwMDgvMDEvMjQgMTY6MzM6NTYgbWggRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkltcG9ydEV4cG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkltcG9ydEV4cG9ydCBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluSW1wb3J0RXhwb3J0IGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5JbXBvcnQvRXhwb3J0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkltcG9ydC9FeHBvcnQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrNDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NzEwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uIyMjQ1NWIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Rm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZvcm1hdC1CYWNrZW5kIE1vZHVsIFJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Rm9ybWF0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5DU1Y8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JbXBvcnRFeHBvcnQucG0gLSB0aGUgYnVsZ2FyaWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyAtLQojICRJZDogYmdfSW1wb3J0RXhwb3J0LnBtLHYgMS40LjIuMSAyMDA4LzA4LzE0IDExOjU3OjU4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6YmdfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40LjIuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9FeHBvcnQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JbXBvcnRFeHBvcnQucG0gLSB0aGUgY3plY2ggdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IE1pbGVuIEtvdXRldgojIC0tCiMgJElkOiBjel9JbXBvcnRFeHBvcnQucG0sdiAxLjQuMi4xIDIwMDgvMDgvMTQgMTE6NTc6NTggbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQuMi4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0L0V4cG9ydCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgZ2VybWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfSW1wb3J0RXhwb3J0LnBtLHYgMS4xNyAyMDA4LzA1LzIxIDA5OjEzOjE1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ICAgICAgICAgICAgICA9ICdJbXBvcnQvRXhwb3J0JzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnSW1wb3J0L0V4cG9ydCBWZXJ3YWx0dW5nJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnTWFwcGluZy1UZW1wbGF0ZSBoaW56dWb8Z2VuJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnSW1wb3J0IHN0YXJ0ZW4nOwogICAgJExhbmctPnsnU3RhcnQgRXhwb3J0J30gICAgICAgICAgICAgICA9ICdFeHBvcnQgc3RhcnRlbic7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NjaHJpdHQnOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdBbGxnZW1laW5lIEluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ09iamVrdC1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdGb3JtYXQtSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnTWFwcGluZy1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdTdWNoLUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ0ltcG9ydCBJbmZvcm1hdGlvbmVuJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnU3BhbHRlJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnRXhwb3J0IHBlciBTdWNoZSBlaXNjaHLkbmtlbic7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ1F1ZWxsLURhdGVpJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBlcmF0b3InfSAgICAgICAgICAgPSAnU3BhbHRlbnRyZW5uZXInOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdTZW1pY29sb24gKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRG9wcGVscHVua3QgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUHVua3QgKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnWmVpY2hlbnNhdHonOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgaW1wb3J0IGV4cG9ydCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LnBtLHYgMS4xOSAyMDA4LzA0LzE3IDExOjI4OjI0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xOSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgUGFyYW1PYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChjb21tb24pCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0MScgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkT2JqZWN0TGlzdDsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRGb3JtYXRMaXN0OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKICAgICAgICBpZiAoICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgZ2V0IG5lZWRlZCBkYXRhCiAgICAgICAgICAgICRUZW1wbGF0ZURhdGEtPntPYmplY3R9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT2JqZWN0JyApOwogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1hdCcgKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgVmFsaWRPcHRpb25TdHJnCiAgICAgICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICAgICAgbXkgJFZhbGlkT3B0aW9uU3RyZyAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkVGVtcGxhdGVEYXRhLT57VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQxJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgID0+ICRPYmplY3RMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9IH0sCiAgICAgICAgICAgICAgICBGb3JtYXROYW1lICAgICAgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgICAgIFZhbGlkT3B0aW9uU3RyZyA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTEnICkgewogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoVGVtcGxhdGVJRCBPYmplY3QgRm9ybWF0IE5hbWUgVmFsaWRJRCBDb21tZW50KSkgewogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57JFBhcmFtfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICBteSAlU3VibWl0ID0gKAogICAgICAgICAgICBTdWJtaXROZXh0ID0+ICdUZW1wbGF0ZUVkaXQyJywKICAgICAgICAgICAgUmVsb2FkICAgICA9PiAnVGVtcGxhdGVFZGl0MScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICBsYXN0IFBBUkFNOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgbXkgJFN1Y2Nlc3M7CiAgICAgICAgaWYgKCAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gZXEgJ05FVycgKSB7CiAgICAgICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTdWNjZXNzID0gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJDYW4ndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISIgKQogICAgICAgICAgICBpZiAhJFN1Y2Nlc3M7CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcgb2JqZWN0IGxpc3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1UZW1wbGF0ZUVkaXQyJlRlbXBsYXRlSUQ9JFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAob2JqZWN0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDInICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9IH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkT2JqZWN0QXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICAgICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE9iamVjdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJE9iamVjdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQyUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJlcXVpcmVkIG5vdGljZQogICAgICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQyUm93UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBzYXZlIChvYmplY3QpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVTYXZlMicgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBteSAlU3VibWl0ID0gKAogICAgICAgICAgICBTdWJtaXROZXh0ID0+ICdUZW1wbGF0ZUVkaXQzJywKICAgICAgICAgICAgU3VibWl0QmFjayA9PiAnVGVtcGxhdGVFZGl0MScsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDInLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhY3Rpb24KICAgICAgICBteSAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIGtleXMgJVN1Ym1pdCApIHsKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE9iamVjdEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmb3JtCiAgICAgICAgbXkgJUF0dHJpYnV0ZVZhbHVlczsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRPYmplY3RBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgZm9ybSBpZiB2YWx1ZSBpcyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICRJdGVtLT57Rm9ybX0tPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0aGUgb2JqZWN0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBPYmplY3REYXRhID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPSRTdWJhY3Rpb24mVGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKGZvcm1hdCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQzJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgRm9ybWF0TmFtZSA9PiAkRm9ybWF0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJEZvcm1hdEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRGb3JtYXRBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRGb3JtYXREYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0M1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCByZXF1aXJlZCBub3RpY2UKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0M1Jvd1JlcXVpcmVkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAoZm9ybWF0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTMnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDInLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQzJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYWN0aW9uCiAgICAgICAgbXkgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKCiAgICAgICAgUEFSQU06CiAgICAgICAgZm9yIG15ICRTdWJtaXRLZXkgKCBrZXlzICVTdWJtaXQgKSB7CiAgICAgICAgICAgIG5leHQgUEFSQU0gaWYgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFN1Ym1pdEtleSApOwoKICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7JFN1Ym1pdEtleX07CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRGb3JtYXRBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHskRm9ybWF0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVsb2FkIGZvcm0gaWYgdmFsdWUgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIGZvcm1hdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj0kU3ViYWN0aW9uJlRlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChtYXBwaW5nKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDQnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAkT2JqZWN0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB9LAogICAgICAgICAgICAgICAgRm9ybWF0TmFtZSA9PiAkRm9ybWF0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgbWFwcGluZyBmb3JtYXQgZGF0YQogICAgICAgICAgICBteSAkTWFwcGluZ0Zvcm1hdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXREYXRhR2V0KAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ09iamVjdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ09iamVjdDo6JyAuICRDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJE1hcHBpbmdPYmplY3REYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRSb3dPYmplY3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnRm9ybWF0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkTWFwcGluZ0Zvcm1hdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NFJvd0Zvcm1hdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUgKG1hcHBpbmcpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVTYXZlNCcgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBteSAlU3VibWl0ID0gKAogICAgICAgICAgICBTdWJtaXROZXh0ID0+ICdUZW1wbGF0ZUVkaXQ1JywKICAgICAgICAgICAgU3VibWl0QmFjayA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBNYXBwaW5nQWRkID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYWN0aW9uCiAgICAgICAgbXkgJFN1YmFjdGlvbiAgICA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICBteSAkU3VibWl0QnV0dG9uID0gJyc7CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gICAgPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICAkU3VibWl0QnV0dG9uID0gJFN1Ym1pdEtleTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBNQVBQSU5HSUQ6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlIHZhbHVlcwogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlVmFsdWVzOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgb2JqZWN0IGZvcm0gZGF0YQogICAgICAgICAgICAgICAgJE9iamVjdEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnT2JqZWN0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBcJU9iamVjdEF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGUgdmFsdWVzCiAgICAgICAgICAgIG15ICVGb3JtYXRBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBmb3JtYXQgZm9ybSBkYXRhCiAgICAgICAgICAgICAgICAkRm9ybWF0QXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdGb3JtYXQ6OicgLiAkQ291bnRlciAuICc6OicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIHRoZSBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdERhdGFTYXZlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIE1hcHBpbmdGb3JtYXREYXRhID0+IFwlRm9ybWF0QXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgIE1BUFBJTkdJRDoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIHRoaXMgbWFwcGluZyByb3cKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRGVsZXRlOjokTWFwcGluZ0lEIiApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtb3ZlIG1hcHBpbmcgZGF0YSByb3cgdXAKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nVXA6OiRNYXBwaW5nSUQiICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdVcCgKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW92ZSBtYXBwaW5nIGRhdGEgcm93IGRvd24KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRG93bjo6JE1hcHBpbmdJRCIgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Rvd24oCiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR0lEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhIG5ldyBtYXBwaW5nIHJvdwogICAgICAgIGlmICggJFN1Ym1pdEJ1dHRvbiBlcSAnTWFwcGluZ0FkZCcgKSB7CiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0FkZCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDUnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJE9iamVjdExpc3Q7CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkRm9ybWF0TGlzdDsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VhcmNoIGRhdGEKICAgICAgICBteSAkU2VhcmNoRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHJlc2NyaWN0IGV4cG9ydCBzdHJpbmcKICAgICAgICBteSAkUmVzdHJpY3RFeHBvcnRTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1Jlc3RyaWN0RXhwb3J0JywKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBWYWx1ZSA9PiBzY2FsYXIga2V5cyAleyRTZWFyY2hEYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFJlc3RyaWN0RXhwb3J0U3RyZyA9PiAkUmVzdHJpY3RFeHBvcnRTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlYXJjaCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJFNlYXJjaEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlYXJjaERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ1Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTUnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBTdWJtaXRCYWNrID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgUmVsb2FkICAgICA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICBsYXN0IFBBUkFNOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYWxsIHNlYXJjaCByZXN0cmljdGlvbnMKICAgICAgICBpZiAoICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXN0cmljdEV4cG9ydCcgKSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj0kU3ViYWN0aW9uJlRlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VhcmNoIGF0dHJpYnV0ZXMKICAgICAgICBteSAkU2VhcmNoQXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBmb3JtIGlmIHZhbHVlIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRoZSBzZWFyY2ggZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gXCVBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVEZWxldGUnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBkZWxldGUgdGVtcGxhdGUgZnJvbSBkYXRhYmFzZQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbXBvcnQgaW5mb3JtYXRpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJbXBvcnRJbmZvcm1hdGlvbicgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkT2JqZWN0TGlzdDsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRGb3JtYXRMaXN0OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wb3J0SW5mb3JtYXRpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbXBvcnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJbXBvcnQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwoKICAgICAgICAjIGdldCBzb3VyY2UgZmlsZQogICAgICAgIG15ICVTb3VyY2VGaWxlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICk7CgogICAgICAgICRTb3VyY2VGaWxle0NvbnRlbnR9IHx8PSAnJzsKCiAgICAgICAgIyBpbXBvcnQgZGF0YQogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkltcG9ydCgKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXCRTb3VyY2VGaWxle0NvbnRlbnR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICdFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJywKICAgICAgICApIGlmICEkUmVzdWx0OwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1PdmVydmlldyZUZW1wbGF0ZUlEPSRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cG9ydCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApCiAgICAgICAgICAgIGlmICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CgogICAgICAgICMgZXhwb3J0IGRhdGEKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5FeHBvcnQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICdFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJywKICAgICAgICApIGlmICEkUmVzdWx0OwoKICAgICAgICBteSAkRmlsZUNvbnRlbnQgPSBqb2luICJcbiIsIEB7ICRSZXN1bHQtPntEZXN0aW5hdGlvbkNvbnRlbnR9IH07CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0V4cG9ydC5jc3YnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9jc3YnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmlsZUNvbnRlbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICkKICAgICAgICAgICAgaWYgISRPYmplY3RMaXN0OwoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKQogICAgICAgICAgICBpZiAhJEZvcm1hdExpc3Q7CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CgogICAgICAgIG15ICRFbXB0eURhdGFiYXNlID0gMTsKCiAgICAgICAgQ0xBU1M6CiAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IHsgJE9iamVjdExpc3QtPnskYX0gY21wICRPYmplY3RMaXN0LT57JGJ9IH0ga2V5cyAleyRPYmplY3RMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3QsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDTEFTUyBpZiAhJFRlbXBsYXRlTGlzdDsKICAgICAgICAgICAgbmV4dCBDTEFTUyBpZiByZWYgJFRlbXBsYXRlTGlzdCBuZSAnQVJSQVknOwogICAgICAgICAgICBuZXh0IENMQVNTIGlmICFAeyRUZW1wbGF0ZUxpc3R9OwoKICAgICAgICAgICAgJEVtcHR5RGF0YWJhc2UgPSAwOwoKICAgICAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJE9iamVjdExpc3QtPnskT2JqZWN0fSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHskVGVtcGxhdGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBvdXRwdXQgb2JqZWN0CiAgICAgICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0TmFtZSA9PiAkRm9ybWF0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyAgID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgICAgICA9PiAkVmFsaWRMaXN0eyAkVGVtcGxhdGVEYXRhLT57VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYW4gZW1wdHkgbGlzdAogICAgICAgIGlmICgkRW1wdHlEYXRhYmFzZSkgewoKICAgICAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJ1RlbXBsYXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveC5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3gucG0sdiAxLjMgMjAwOC8wNC8wNCAxMDoyMTo1OSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dENoZWNrYm94IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIGZvciBjaGVja2JveCBlbGVtZW50cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveC0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybUlucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIG15ICRTdHJpbmcgPSAiPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCIkUGFyYW17UHJlZml4fSRQYXJhbXtJdGVtfS0+e0tleX1cIiAiOwoKICAgIGlmICggJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkU3RyaW5nIC49ICJjaGVja2VkICI7CiAgICB9CgogICAgJFN0cmluZyAuPSAiPiAiOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA4LzA0LzA0IDEwOjIxOjU5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXREVEwucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dERUTC5wbSx2IDEuMiAyMDA4LzA0LzA0IDEwOjIxOjU5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dERUTDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dERUTCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgZGlzcGxheSBEVEwgY29kZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEwtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0RhdGF9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KCk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm47Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA4LzA0LzA0IDEwOjIxOjU5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24ucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbi5wbSx2IDEuNyAyMDA4LzA0LzA0IDEwOjIxOjU5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbiAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3Igc2VsZWN0aW9uIGVsZW1lbnRzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbi0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybUlucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZQogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwogICAgJFBhcmFte1ZhbHVlfSAgfHw9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CgogICAgaWYgKCAkUGFyYW17VmFsdWV9ICYmICRQYXJhbXtWYWx1ZX0gPX4gbXsgIyMjIyMgfXhtcyApIHsKICAgICAgICBteSBAVmFsdWVzID0gc3BsaXQgJyMjIyMjJywgJFBhcmFte1ZhbHVlfTsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gXEBWYWx1ZXM7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBvcHRpb24gc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte1ByZWZpeH0gLiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntEYXRhfSB8fCB7fSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntQb3NzaWJsZU5vbmV9LAogICAgICAgIE11bHRpcGxlICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNdWx0aXBsZX0sCiAgICAgICAgU2l6ZSAgICAgICAgID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9LAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBARm9ybURhdGFzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KAogICAgICAgIFBhcmFtID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICk7CgogICAgbXkgJEZvcm1EYXRhID0gam9pbiAnIyMjIyMnLCBARm9ybURhdGFzOwoKICAgIHJldHVybiAkRm9ybURhdGEgaWYgJEZvcm1EYXRhOwogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAhJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9OwoKICAgICMgc2V0IGludmFsaWQgcGFyYW0KICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57SW52YWxpZH0gPSAxOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA4LzA0LzA0IDEwOjIxOjU5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtLHYgMS42IDIwMDgvMDQvMDQgMTA6MjE6NTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0VGV4dDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFRleHQgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIHRleHQgZWxlbWVudHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0VGV4dC0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybUlucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKICAgIG15ICRTaXplID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0gfHwgNDA7CiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17UHJlZml4fSRQYXJhbXtJdGVtfS0+e0tleX1cIiBzaXplPVwiJFNpemVcIiAiOwoKICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFZhbHVlKTsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU3RyaW5nIC49ICJ2YWx1ZT1cIiRWYWx1ZVwiICI7CiAgICB9CgogICAgIyBhZGQgbWF4aW11bSBsZW5ndGgKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TWF4TGVuZ3RofSApIHsKICAgICAgICAkU3RyaW5nIC49ICJtYXhsZW5ndGg9XCIkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9XCIgIjsKICAgIH0KCiAgICAkU3RyaW5nIC49ICI+ICI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICk7CgogICAgIyByZWdleCBjaGVjawogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdleH0gJiYgJEZvcm1EYXRhICF+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZ2V4fSApIHsKCiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgcmV0dXJuICRGb3JtRGF0YTsKICAgIH0KCiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICRGb3JtRGF0YTsKICAgIHJldHVybiAkRm9ybURhdGEgaWYgISRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+e0ludmFsaWR9ID0gMTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAwOC8wNC8wNCAxMDoyMTo1OSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0IGZvciBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExheW91dEltcG9ydEV4cG9ydC5wbSx2IDEuMyAyMDA4LzAyLzA1IDExOjI5OjAxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dEltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aXRlbSBJbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoKQoKcmV0dXJucyBhIGlucHV0IGZpZWxkIGh0bWwgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiAnVmFsdWUnLCAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiAnJyBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBsb29rdXAgaXRlbSB2YWx1ZQogICAgbXkgJFN0cmluZyA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gSW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoKQoKcmV0dXJucyB0aGUgdmFsdWVzIGZyb20gdGhlIGh0bWwgZm9ybSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YSA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydEV4cG9ydEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KCVQYXJhbSk7CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKPWl0ZW0gX0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKCkKCnRvIGxvYWQgYSBpbXBvcnQvZXhwb3J0IGxheW91dCBiYWNrZW5kIG1vZHVsZQoKICAgICRIYXNoUmVmID0gJExheW91dE9iamVjdC0+X0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICApOwoKPWN1dAoKc3ViIF9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVHlwZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgb2JqZWN0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntJbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZH0tPnsgJFBhcmFte1R5cGV9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfTsKCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0JFBhcmFte1R5cGV9IjsKCiAgICAjIGxvYWQgdGhlIGJhY2tlbmQgbW9kdWxlCiAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSBvYmplY3QKICAgICRTZWxmLT57Q2FjaGV9LT57SW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmR9LT57ICRQYXJhbXtUeXBlfSB9ID0gJEJhY2tlbmRPYmplY3Q7CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwo=
IyAtLQojIEFkbWluSW1wb3J0RXhwb3J0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LmR0bCx2IDEuMTUgMjAwOC8wMi8xMiAxMDozMTo0MyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlRWRpdDEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSJORVciPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBtYXBwaW5nIHRlbXBsYXRlIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAwIj4kVGV4dHsiT2JqZWN0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2JqZWN0T3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZvcm1hdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkZvcm1hdE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyIkUURhdGF7Ik9iamVjdE5hbWUifSJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTnVtYmVyIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZvcm1hdCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7InZhbGlkIn0vJFRleHR7ImludmFsaWQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI5MCI+JFRleHR7IkRlbGV0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjkwIj4kVGV4dHsiU3RhcnQgSW1wb3J0In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iOTAiPiRUZXh0eyJTdGFydCBFeHBvcnQifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VGVtcGxhdGVFZGl0MSZUZW1wbGF0ZUlEPSRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJOdW1iZXIifQogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGV4dHsiJFFEYXRheyJGb3JtYXROYW1lIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiVmFsaWQifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VGVtcGxhdGVEZWxldGUmVGVtcGxhdGVJRD0kUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgICAgICAgICAgICRUZXh0eyJ4In0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249SW1wb3J0SW5mb3JtYXRpb24mVGVtcGxhdGVJRD0kUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgICAgICAgICAgICRUZXh0eyJ4In0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RXhwb3J0JlRlbXBsYXRlSUQ9JFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAkVGV4dHsieCJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQxIC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSIkUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU3RlcCJ9IDEgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbiJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT2JqZWN0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik9iamVjdE5hbWUifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik9iamVjdCIgdmFsdWU9IiRRRGF0YXsiT2JqZWN0In0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRm9ybWF0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkZvcm1hdE5hbWUifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1hdCIgdmFsdWU9IiRRRGF0YXsiRm9ybWF0In0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWxpZE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iJFRleHR7Ik5leHQuLi4ifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MSAtLT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MiAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmUyIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlN0ZXAifSAyICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBvYmplY3QgaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT2JqZWN0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik9iamVjdE5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyUm93IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9Ogo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyUm93UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgdGl0bGU9IiRUZXh0eyJSZXF1aXJlZCJ9Ij4qPC9mb250Pgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyUm93UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MlJvdyAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXRCYWNrIiB2YWx1ZT0iJFRleHR7Ii4uLkJhY2sifSI+Jm5ic3A7CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IiRUZXh0eyJOZXh0Li4uIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDMgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlMyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTdGVwIn0gMyAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgZm9ybWF0IGluZm9ybWF0aW9uIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ik5hbWUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZvcm1hdCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJGb3JtYXROYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0M1JvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifToKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0M1Jvd1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0M1Jvd1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IklucHV0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNSb3cgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IiRUZXh0eyIuLi5CYWNrIn0iPiZuYnNwOwogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdE5leHQiIHZhbHVlPSIkVGV4dHsiTmV4dC4uLiJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzIC0tPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0IC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSIkUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU3RlcCJ9IDQgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7Ik9iamVjdE5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJGb3JtYXROYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+PGhyIHdpZHRoPSIxMDAlIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3dPYmplY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvd09iamVjdCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvd0Zvcm1hdCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnB1dFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Um93Rm9ybWF0IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdVcDo6JFFEYXRheyJNYXBwaW5nSUQifSIgdmFsdWU9IiRUZXh0eyJVcCJ9Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nRG93bjo6JFFEYXRheyJNYXBwaW5nSUQifSIgdmFsdWU9IiRUZXh0eyJEb3duIn0iPgogICAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdEZWxldGU6OiRRRGF0YXsiTWFwcGluZ0lEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjMiPjxociB3aWR0aD0iMTAwJSI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSIzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nQWRkIiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdEJhY2siIHZhbHVlPSIkVGV4dHsiLi4uQmFjayJ9Ij4mbmJzcDsKICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iJFRleHR7Ik5leHQuLi4ifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NCAtLT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NSAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmU1Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlN0ZXAifSA1ICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24ifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJSZXN0cmljdEV4cG9ydFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4mbmJzcDs8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NVJvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifToKICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnB1dFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ1Um93IC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdEJhY2siIHZhbHVlPSIkVGV4dHsiLi4uQmFjayJ9Ij4mbmJzcDsKICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iJFRleHR7IkZpbmlzaCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ1IC0tPgo8IS0tIGR0bDpibG9jazpJbXBvcnRJbmZvcm1hdGlvbiAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSW1wb3J0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkltcG9ydCBpbmZvcm1hdGlvbiJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJTb3VyY2UgRmlsZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9IlNvdXJjZUZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN0YXJ0IEltcG9ydCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpJbXBvcnRJbmZvcm1hdGlvbiAtLT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0LnBtIC0gYWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBtLHYgMS4yNiAyMDA4LzA0LzE3IDExOjI5OjA0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQgLSBpbXBvcnQsIGV4cG9ydCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEltcG9ydEV4cG9ydE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGVtcGxhdGVMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgdGVtcGxhdGVzIGFzIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRm9ybWF0ID0+ICdDU1YnICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEZvcm1hdCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0gKSB8fCAnJzsKICAgIH0KICAgICRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17VXNlcklEfSwgJ0ludGVnZXInICk7CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSAxPTEgJzsKCiAgICBpZiAoICRQYXJhbXtPYmplY3R9ICkgewogICAgICAgICRTUUwgLj0gIkFORCBpbWV4cG9ydF9vYmplY3QgPSAnJFBhcmFte09iamVjdH0nICI7CiAgICB9CiAgICBpZiAoICRQYXJhbXtGb3JtYXR9ICkgewogICAgICAgICRTUUwgLj0gIkFORCBpbWV4cG9ydF9mb3JtYXQgPSAnJFBhcmFte0Zvcm1hdH0nICI7CiAgICB9CgogICAgIyBhZGQgb3JkZXIgb3B0aW9uCiAgICAkU1FMIC49ICdPUkRFUiBCWSBpZCc7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFRlbXBsYXRlTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAVGVtcGxhdGVMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQFRlbXBsYXRlTGlzdDsKfQoKPWl0ZW0gVGVtcGxhdGVHZXQoKQoKZ2V0IGEgaW1wb3J0IGV4cG9ydCB0ZW1wbGF0ZQoKUmV0dXJuCiAgICAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9CiAgICAkVGVtcGxhdGVEYXRhe051bWJlcn0KICAgICRUZW1wbGF0ZURhdGF7T2JqZWN0fQogICAgJFRlbXBsYXRlRGF0YXtGb3JtYXR9CiAgICAkVGVtcGxhdGVEYXRhe05hbWV9CiAgICAkVGVtcGxhdGVEYXRhe1ZhbGlkSUR9CiAgICAkVGVtcGxhdGVEYXRhe0NvbW1lbnR9CiAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZVRpbWV9CiAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZUJ5fQogICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VUaW1lfQogICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VCeX0KCiAgICBteSAkVGVtcGxhdGVEYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZQogICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17VGVtcGxhdGVJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgaW1leHBvcnRfb2JqZWN0LCBpbWV4cG9ydF9mb3JtYXQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgIgogICAgICAgIC4gImNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSAiCiAgICAgICAgLiAiaWQgPSAkUGFyYW17VGVtcGxhdGVJRH0iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVRlbXBsYXRlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfSA9ICRSb3dbMF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtPYmplY3R9ICAgICA9ICRSb3dbMV07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtGb3JtYXR9ICAgICA9ICRSb3dbMl07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbM107CiAgICAgICAgJFRlbXBsYXRlRGF0YXtWYWxpZElEfSAgICA9ICRSb3dbNF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDb21tZW50fSAgICA9ICRSb3dbNV0gfHwgJyc7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNl07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVCeX0gICA9ICRSb3dbN107CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbOF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbOV07CgogICAgICAgICRUZW1wbGF0ZURhdGF7TnVtYmVyfSA9IHNwcmludGYgIiUwNmQiLCAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9OwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH0gPSBcJVRlbXBsYXRlRGF0YTsKCiAgICByZXR1cm4gXCVUZW1wbGF0ZURhdGE7Cn0KCj1pdGVtIFRlbXBsYXRlQWRkKCkKCmFkZCBhIG5ldyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlCgogICAgbXkgJFRlbXBsYXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdUaWNrZXQnLAogICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgTmFtZSAgICA9PiAnVGVtcGxhdGUgTmFtZScsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgJFBhcmFte0NvbW1lbnR9ID0gJFBhcmFte0NvbW1lbnR9IHx8ICcnOwoKICAgICMgcXVvdGUKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQgTmFtZSBGdW5jdGlvbmFsaXR5IENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9ICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMgKHJlcGxhY2UgaXQgd2l0aCBTdHJpbmdDbGVhbigpIGluIE9UUlMgMi4zIGFuZCBsYXRlcikKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQpKSB7CiAgICAgICAgJFNlbGYtPl9TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPl9TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgIgogICAgICAgICAgICAuICJXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSAnJFBhcmFte09iamVjdH0nIEFORCBuYW1lID0gJyRQYXJhbXtOYW1lfSciLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROb0FkZCA9IDE7CiAgICB9CgogICAgIyBhYm9ydCBpbnNlcnQgb2YgbmV3IHRlbXBsYXRlLCBpZiB0ZW1wbGF0ZSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IHRlbXBsYXRlISBUZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIG9iamVjdC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyB0ZW1wbGF0ZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBpbWV4cG9ydF90ZW1wbGF0ZSAiCiAgICAgICAgICAgIC4gIihpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAiCiAgICAgICAgICAgIC4gImNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAiCiAgICAgICAgICAgIC4gIignJFBhcmFte09iamVjdH0nLCAnJFBhcmFte0Zvcm1hdH0nLCAiCiAgICAgICAgICAgIC4gIickUGFyYW17TmFtZX0nLCAkUGFyYW17VmFsaWRJRH0sICckUGFyYW17Q29tbWVudH0nLCAiCiAgICAgICAgICAgIC4gImN1cnJlbnRfdGltZXN0YW1wLCAkUGFyYW17VXNlcklEfSwgY3VycmVudF90aW1lc3RhbXAsICRQYXJhbXtVc2VySUR9KSIKICAgICk7CgogICAgIyBmaW5kIGlkIG9mIG5ldyB0ZW1wbGF0ZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSAiCiAgICAgICAgICAgIC4gIldIRVJFIGltZXhwb3J0X29iamVjdCA9ICckUGFyYW17T2JqZWN0fScgQU5EIG5hbWUgPSAnJFBhcmFte05hbWV9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVGVtcGxhdGVJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRlbXBsYXRlSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkVGVtcGxhdGVJRDsKfQoKPWl0ZW0gVGVtcGxhdGVVcGRhdGUoKQoKdXBkYXRlIGEgZXhpc3RpbmcgaW1wb3J0L2V4cG9ydCB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGVtcGxhdGUgTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSA9ICRQYXJhbXtDb21tZW50fSB8fCAnJzsKCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9ICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcyAocmVwbGFjZSBpdCB3aXRoIFN0cmluZ0NsZWFuKCkgaW4gT1RSUyAyLjMgYW5kIGxhdGVyKQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT5fU3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBvYmplY3Qgb2YgdGhpcyB0ZW1wbGF0ZSBpZAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaW1leHBvcnRfb2JqZWN0IEZST00gaW1leHBvcnRfdGVtcGxhdGUgIgogICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkT2JqZWN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0ID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICEkT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgdXBkYXRlIHRlbXBsYXRlISBJIGNhbid0IGZpbmQgdGhlIHRlbXBsYXRlLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgIgogICAgICAgICAgICAuICJXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSAnJE9iamVjdCcgQU5EIG5hbWUgPSAnJFBhcmFte05hbWV9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVXBkYXRlID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCB1cGRhdGUgdGVtcGxhdGUhIFRlbXBsYXRlIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgb2JqZWN0LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgdXBkYXRlIHRlbXBsYXRlCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiVVBEQVRFIGltZXhwb3J0X3RlbXBsYXRlIFNFVCBuYW1lID0gJyRQYXJhbXtOYW1lfScsIgogICAgICAgICAgICAuICJ2YWxpZF9pZCA9ICRQYXJhbXtWYWxpZElEfSwgY29tbWVudHMgPSAnJFBhcmFte0NvbW1lbnR9JywgIgogICAgICAgICAgICAuICJjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSAkUGFyYW17VXNlcklEfSAiCiAgICAgICAgICAgIC4gIldIRVJFIGlkID0gJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICk7Cn0KCj1pdGVtIFRlbXBsYXRlRGVsZXRlKCkKCmRlbGV0ZSBleGlzdGluZyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlcwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBzZWFyY2ggZGF0YQogICAgJFNlbGYtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIG1hcHBpbmcgZGF0YQogICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHsgJFBhcmFte1RlbXBsYXRlSUR9IH0gKSB7CiAgICAgICAgJFNlbGYtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgZGF0YQogICAgJFNlbGYtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEKICAgICRTZWxmLT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgcXVvdGUKICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkVGVtcGxhdGVJRCwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luICcsJywgQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGlkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICApOwp9Cgo9aXRlbSBPYmplY3RMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgYXZhaWxhYmxlIG9iamVjdHMgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCj1jdXQKCnN1YiBPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnCiAgICBteSAkTW9kdWxlTGlzdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiAgICByZXR1cm4gaWYgISRNb2R1bGVMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkTW9kdWxlTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjcmVhdGUgdGhlIG9iamVjdCBsaXN0CiAgICBteSAkT2JqZWN0TGlzdCA9IHt9OwogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJXskTW9kdWxlTGlzdH0gKSB7CiAgICAgICAgJE9iamVjdExpc3QtPnskTW9kdWxlfSA9ICRNb2R1bGVMaXN0LT57JE1vZHVsZX0tPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gJE9iamVjdExpc3Q7Cn0KCj1pdGVtIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICVQYXJhbSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gT2JqZWN0RGF0YUdldCgpCgpnZXQgdGhlIG9iamVjdCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcXVvdGUKICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1RlbXBsYXRlSUR9LCAnSW50ZWdlcicgKTsKCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X29iamVjdCBXSEVSRSAiCiAgICAgICAgLiAidGVtcGxhdGVfaWQgPSAkUGFyYW17VGVtcGxhdGVJRH0iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVPYmplY3REYXRhOwp9Cgo9aXRlbSBPYmplY3REYXRhU2F2ZSgpCgpzYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBPYmplY3REYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17T2JqZWN0RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnT2JqZWN0RGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEKICAgICRTZWxmLT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtPYmplY3REYXRhfSB9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgbXkgJFFEYXRhS2V5ICAgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJERhdGFLZXkpOwogICAgICAgIG15ICRRRGF0YVZhbHVlID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17T2JqZWN0RGF0YX0tPnskRGF0YUtleX0gKTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICRRRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJFFEYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gaW1leHBvcnRfb2JqZWN0ICIKICAgICAgICAgICAgICAgIC4gIih0ZW1wbGF0ZV9pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAiCiAgICAgICAgICAgICAgICAuICIoJFBhcmFte1RlbXBsYXRlSUR9LCAnJFFEYXRhS2V5JywgJyRRRGF0YVZhbHVlJykiCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gT2JqZWN0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHsgJFBhcmFte1RlbXBsYXRlSUR9IH0gKSB7CiAgICAgICAgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRUZW1wbGF0ZUlELCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gJywnLCBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9vYmplY3QgV0hFUkUgdGVtcGxhdGVfaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICk7Cn0KCj1pdGVtIEZvcm1hdExpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBhdmFpbGFibGUgZm9ybWF0cyBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtYXRMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKPWN1dAoKc3ViIEZvcm1hdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcKICAgIG15ICRNb2R1bGVMaXN0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKICAgIHJldHVybiBpZiAhJE1vZHVsZUxpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRNb2R1bGVMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNyZWF0ZSB0aGUgZm9ybWF0IGxpc3QKICAgIG15ICRGb3JtYXRMaXN0ID0ge307CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRNb2R1bGVMaXN0fSApIHsKICAgICAgICAkRm9ybWF0TGlzdC0+eyRNb2R1bGV9ID0gJE1vZHVsZUxpc3QtPnskTW9kdWxlfS0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiAkRm9ybWF0TGlzdDsKfQoKPWl0ZW0gRm9ybWF0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYSBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIGZvcm1hdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIEZvcm1hdERhdGFHZXQoKQoKZ2V0IHRoZSBmb3JtYXQgZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkRm9ybWF0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHF1b3RlCiAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtUZW1wbGF0ZUlEfSwgJ0ludGVnZXInICk7CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICJTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9mb3JtYXQgV0hFUkUgIgogICAgICAgIC4gInRlbXBsYXRlX2lkID0gJFBhcmFte1RlbXBsYXRlSUR9IjsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRm9ybWF0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEZvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybWF0RGF0YTsKfQoKPWl0ZW0gRm9ybWF0RGF0YVNhdmUoKQoKc2F2ZSB0aGUgZm9ybWF0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgRm9ybWF0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte0Zvcm1hdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0Zvcm1hdERhdGEgbXVzdCBiZSBhbiBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBkYXRhCiAgICAkU2VsZi0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICgga2V5cyAleyAkUGFyYW17Rm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIG15ICRRRGF0YUtleSAgID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCREYXRhS2V5KTsKICAgICAgICBteSAkUURhdGFWYWx1ZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte0Zvcm1hdERhdGF9LT57JERhdGFLZXl9ICk7CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkUURhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICRRRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGltZXhwb3J0X2Zvcm1hdCAiCiAgICAgICAgICAgICAgICAuICIodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgIgogICAgICAgICAgICAgICAgLiAiKCRQYXJhbXtUZW1wbGF0ZUlEfSwgJyRRRGF0YUtleScsICckUURhdGFWYWx1ZScpIgogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEZvcm1hdERhdGFEZWxldGUoKQoKZGVsZXRlIHRoZSBleGlzdGluZyBmb3JtYXQgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcXVvdGUKICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkVGVtcGxhdGVJRCwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luICcsJywgQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICApOwp9Cgo9aXRlbSBNYXBwaW5nTGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIG1hcHBpbmcgZGF0YSBpZHMgc29ydGVkIGJ5IHBvc2l0aW9uIGFzIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZQogICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17VGVtcGxhdGVJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSAiCiAgICAgICAgLiAidGVtcGxhdGVfaWQgPSAkUGFyYW17VGVtcGxhdGVJRH0gT1JERVIgQlkgcG9zaXRpb24iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBNYXBwaW5nTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATWFwcGluZ0xpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxATWFwcGluZ0xpc3Q7Cn0KCj1pdGVtIE1hcHBpbmdBZGQoKQoKYWRkIGEgbmV3IG1hcHBpbmcgZGF0YSByb3cKCiAgICBteSAkTWFwcGluZ0lEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0FkZCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGZpbmQgbWF4aW11bSBwb3NpdGlvbgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgbWF4KHBvc2l0aW9uKSBGUk9NIGltZXhwb3J0X21hcHBpbmcgIgogICAgICAgICAgICAuICJXSEVSRSB0ZW1wbGF0ZV9pZCA9ICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTmV3UG9zaXRpb24gPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRSb3dbMF0gKSB7CiAgICAgICAgICAgICROZXdQb3NpdGlvbiA9ICRSb3dbMF07CiAgICAgICAgICAgICROZXdQb3NpdGlvbisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGluc2VydCBhIG5ldyBtYXBwaW5nIGRhdGEgcm93CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGltZXhwb3J0X21hcHBpbmcgIgogICAgICAgICAgICAuICIodGVtcGxhdGVfaWQsIHBvc2l0aW9uKSBWQUxVRVMgIgogICAgICAgICAgICAuICIoJFBhcmFte1RlbXBsYXRlSUR9LCAkTmV3UG9zaXRpb24pIgogICAgKTsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IG1hcHBpbmcgZGF0YSByb3cKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gaW1leHBvcnRfbWFwcGluZyAiCiAgICAgICAgICAgIC4gIldIRVJFIHRlbXBsYXRlX2lkID0gJFBhcmFte1RlbXBsYXRlSUR9IEFORCBwb3NpdGlvbiA9ICROZXdQb3NpdGlvbiIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTWFwcGluZ0lEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ0lEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJE1hcHBpbmdJRDsKfQoKPWl0ZW0gTWFwcGluZ0RlbGV0ZSgpCgpkZWxldGUgZXhpc3RpbmcgbWFwcGluZyBkYXRhIHJvd3MKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte01hcHBpbmdJRH0gKSB7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17TWFwcGluZ0lEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdJRH0sICdJbnRlZ2VyJyApOwoKICAgICAgICAjIGRlbGV0ZSBvbmUgbWFwcGluZyByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ICRQYXJhbXtNYXBwaW5nSUR9IiwKICAgICAgICApOwoKICAgICAgICAjIHJlYnVpbGQgbWFwcGluZyBwb3NpdGlvbnMKICAgICAgICAkU2VsZi0+TWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAgICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgbWFwcGluZyBkYXRhCiAgICAgICAgICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYWxsIG1hcHBpbmcgcm93cyBvZiB0aGlzIHRlbXBsYXRlCiAgICAgICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBNYXBwaW5nVXAoKQoKbW92ZSBhbiBtYXBwaW5nIGRhdGEgcm93IHVwCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nVXAoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nVXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte01hcHBpbmdJRH0gPT0gJE1hcHBpbmdMaXN0LT5bMF07CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBnZXQgcG9zaXRpb24KICAgIG15ICRTUUwgPSAiU0VMRUNUIHBvc2l0aW9uIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ICRQYXJhbXtNYXBwaW5nSUR9IjsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkUG9zaXRpb247CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIDEgaWYgISRQb3NpdGlvbjsKCiAgICBteSAkUG9zaXRpb25VcHBlciA9ICRQb3NpdGlvbiAtIDE7CgogICAgIyB1cGRhdGUgcG9zaXRpb25zCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSAkUG9zaXRpb24gIgogICAgICAgICAgICAuICJXSEVSRSB0ZW1wbGF0ZV9pZCA9ICRQYXJhbXtUZW1wbGF0ZUlEfSBBTkQgcG9zaXRpb24gPSAkUG9zaXRpb25VcHBlciIsCiAgICApOwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gJFBvc2l0aW9uVXBwZXIgIgogICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRQYXJhbXtNYXBwaW5nSUR9IiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdEb3duKCkKCm1vdmUgYW4gbWFwcGluZyBkYXRhIHJvdyBkb3duCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRG93bigKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEb3duIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxIGlmICRQYXJhbXtNYXBwaW5nSUR9ID09ICRNYXBwaW5nTGlzdC0+Wy0xXTsKCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGdldCBwb3NpdGlvbgogICAgbXkgJFNRTCA9ICJTRUxFQ1QgcG9zaXRpb24gRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gJFBhcmFte01hcHBpbmdJRH0iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRQb3NpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICBteSAkUG9zaXRpb25Eb3duID0gJFBvc2l0aW9uICsgMTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbnMKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ICRQb3NpdGlvbiAiCiAgICAgICAgICAgIC4gIldIRVJFIHRlbXBsYXRlX2lkID0gJFBhcmFte1RlbXBsYXRlSUR9IEFORCBwb3NpdGlvbiA9ICRQb3NpdGlvbkRvd24iLAogICAgKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ICRQb3NpdGlvbkRvd24gIgogICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRQYXJhbXtNYXBwaW5nSUR9IiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdQb3NpdGlvblJlYnVpbGQoKQoKcmVidWlsZCB0aGUgcG9zaXRpb25zIG9mIGEgbWFwcGluZyBsaXN0CgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nUG9zaXRpb25SZWJ1aWxkKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ1Bvc2l0aW9uUmVidWlsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdXBkYXRlIHBvc2l0aW9uCiAgICBteSAkQ291bnRlciA9IDA7CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gJENvdW50ZXIgIgogICAgICAgICAgICAgICAgLiAiV0hFUkUgaWQgPSAkTWFwcGluZ0lEIiwKICAgICAgICApOwogICAgICAgICRDb3VudGVyKys7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3REYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte01hcHBpbmdJRH0gKSB7CiAgICAgICAgJFBhcmFte01hcHBpbmdJRH0gPSBbICRQYXJhbXtNYXBwaW5nSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17TWFwcGluZ0lEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0lEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyAkUGFyYW17TWFwcGluZ0lEfSB9ICkgewogICAgICAgICRNYXBwaW5nSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRNYXBwaW5nSUQsICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIGlkIHN0cmluZwogICAgbXkgJE1hcHBpbmdJRFN0cmluZyA9IGpvaW4gJywnLCBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCBXSEVSRSBtYXBwaW5nX2lkIElOICggJE1hcHBpbmdJRFN0cmluZyApIiwKICAgICk7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3REYXRhU2F2ZSgpCgpzYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBNYXBwaW5nT2JqZWN0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdPYmplY3REYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nT2JqZWN0RGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIG15ICRRRGF0YUtleSAgID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCREYXRhS2V5KTsKICAgICAgICBteSAkUURhdGFWYWx1ZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdPYmplY3REYXRhfS0+eyREYXRhS2V5fSApOwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJFFEYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkUURhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgb2JqZWN0IHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCAiCiAgICAgICAgICAgICAgICAuICIobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAiCiAgICAgICAgICAgICAgICAuICIoJFBhcmFte01hcHBpbmdJRH0sICckUURhdGFLZXknLCAnJFFEYXRhVmFsdWUnKSIKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0RGF0YUdldCgpCgpnZXQgdGhlIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHF1b3RlCiAgICAkUGFyYW17TWFwcGluZ0lEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAiU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgV0hFUkUgIgogICAgICAgIC4gIm1hcHBpbmdfaWQgPSAkUGFyYW17TWFwcGluZ0lEfSI7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU1hcHBpbmdPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ09iamVjdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlTWFwcGluZ09iamVjdERhdGE7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgZm9ybWF0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte01hcHBpbmdJRH0gKSB7CiAgICAgICAgJFBhcmFte01hcHBpbmdJRH0gPSBbICRQYXJhbXtNYXBwaW5nSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17TWFwcGluZ0lEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0lEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyAkUGFyYW17TWFwcGluZ0lEfSB9ICkgewogICAgICAgICRNYXBwaW5nSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRNYXBwaW5nSUQsICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIGlkIHN0cmluZwogICAgbXkgJE1hcHBpbmdJRFN0cmluZyA9IGpvaW4gJywnLCBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgZm9ybWF0IGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCBXSEVSRSBtYXBwaW5nX2lkIElOICggJE1hcHBpbmdJRFN0cmluZyApIiwKICAgICk7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXREYXRhU2F2ZSgpCgpzYXZlIHRoZSBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhU2F2ZSgKICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgTWFwcGluZ0Zvcm1hdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBNYXBwaW5nRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nRm9ybWF0RGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgJFNlbGYtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIG15ICRRRGF0YUtleSAgID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCREYXRhS2V5KTsKICAgICAgICBteSAkUURhdGFWYWx1ZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfS0+eyREYXRhS2V5fSApOwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJFFEYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkUURhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgZm9ybWF0IHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCAiCiAgICAgICAgICAgICAgICAuICIobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAiCiAgICAgICAgICAgICAgICAuICIoJFBhcmFte01hcHBpbmdJRH0sICckUURhdGFLZXknLCAnJFFEYXRhVmFsdWUnKSIKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nRm9ybWF0RGF0YUdldCgpCgpnZXQgdGhlIGZvcm1hdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFHZXQoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHF1b3RlCiAgICAkUGFyYW17TWFwcGluZ0lEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte01hcHBpbmdJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAiU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfbWFwcGluZ19mb3JtYXQgV0hFUkUgIgogICAgICAgIC4gIm1hcHBpbmdfaWQgPSAkUGFyYW17TWFwcGluZ0lEfSI7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU1hcHBpbmdGb3JtYXREYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ0Zvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlTWFwcGluZ0Zvcm1hdERhdGE7Cn0KCj1pdGVtIFNlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggYXR0cmlidXRlcyBvZiBhIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoQXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBzZWFyY2ggYXR0cmlidXRlIGxpc3Qgb2YgYW4gb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgICVQYXJhbSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gU2VhcmNoRGF0YUdldCgpCgpnZXQgdGhlIHNlYXJjaCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRTZWFyY2hEYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcXVvdGUKICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1RlbXBsYXRlSUR9LCAnSW50ZWdlcicgKTsKCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X3NlYXJjaCBXSEVSRSAiCiAgICAgICAgLiAidGVtcGxhdGVfaWQgPSAkUGFyYW17VGVtcGxhdGVJRH0iOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZWFyY2hEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VhcmNoRGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVTZWFyY2hEYXRhOwp9Cgo9aXRlbSBTZWFyY2hEYXRhU2F2ZSgpCgpzYXZlIHRoZSBzZWFyY2ggZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBTZWFyY2hEYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBTZWFyY2hEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU2VhcmNoRGF0YSBtdXN0IGJlIGFuIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEKICAgICRTZWxmLT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtTZWFyY2hEYXRhfSB9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgbXkgJFFEYXRhS2V5ICAgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJERhdGFLZXkpOwogICAgICAgIG15ICRRRGF0YVZhbHVlID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17U2VhcmNoRGF0YX0tPnskRGF0YUtleX0gKTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkUURhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkUURhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBpbWV4cG9ydF9zZWFyY2ggIgogICAgICAgICAgICAgICAgLiAiKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICIKICAgICAgICAgICAgICAgIC4gIigkUGFyYW17VGVtcGxhdGVJRH0sICckUURhdGFLZXknLCAnJFFEYXRhVmFsdWUnKSIKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTZWFyY2hEYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJFRlbXBsYXRlSUQgKCBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFRlbXBsYXRlSUQsICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiAnLCcsIEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X3NlYXJjaCBXSEVSRSB0ZW1wbGF0ZV9pZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgKTsKfQoKPWl0ZW0gRXhwb3J0KCkKCmV4cG9ydCBmdW5jdGlvbgoKICAgIG15ICRSZXN1bHRSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5FeHBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IG5vdCBjb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRGb3JtYXRCYWNrZW5kOwoKICAgICMgZ2V0IGV4cG9ydCBkYXRhCiAgICBteSAkRXhwb3J0RGF0YSA9ICRPYmplY3RCYWNrZW5kLT5FeHBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVSZXN1bHQ7CiAgICAkUmVzdWx0e1N1Y2Nlc3N9ICAgICAgICAgICAgPSAwOwogICAgJFJlc3VsdHtGYWlsZWR9ICAgICAgICAgICAgID0gMDsKICAgICRSZXN1bHR7RGVzdGluYXRpb25Db250ZW50fSA9IFtdOwoKICAgIEVYUE9SVERBVEFST1c6CiAgICBmb3IgbXkgJEV4cG9ydERhdGFSb3cgKCBAeyRFeHBvcnREYXRhfSApIHsKCiAgICAgICAgIyBleHBvcnQgb25lIHJvdwogICAgICAgIG15ICREZXN0aW5hdGlvbkNvbnRlbnRSb3cgPSAkRm9ybWF0QmFja2VuZC0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRFeHBvcnREYXRhUm93LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggIWRlZmluZWQgJERlc3RpbmF0aW9uQ29udGVudFJvdyApIHsKICAgICAgICAgICAgJFJlc3VsdHtGYWlsZWR9Kys7CiAgICAgICAgICAgIG5leHQgRVhQT1JUREFUQVJPVzsKICAgICAgICB9CgogICAgICAgICMgYWRkIHJvdyB0byBkZXN0aW5hdGlvbiBjb250ZW50CiAgICAgICAgcHVzaCBAeyAkUmVzdWx0e0Rlc3RpbmF0aW9uQ29udGVudH0gfSwgJERlc3RpbmF0aW9uQ29udGVudFJvdzsKICAgICAgICAkUmVzdWx0e1N1Y2Nlc3N9Kys7CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiRXhwb3J0IG9mICRSZXN1bHR7RmFpbGVkfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IGZhaWxlZCEiLAogICAgKTsKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJFeHBvcnQgb2YgJFJlc3VsdHtTdWNjZXNzfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IHN1Y2Nlc3MhIiwKICAgICk7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBJbXBvcnQoKQoKaW1wb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkltcG9ydCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTdHJpbmdSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIG9iamVjdCBiYWNrZW5kCiAgICBteSAkT2JqZWN0QmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57T2JqZWN0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJE9iamVjdEJhY2tlbmQ7CgogICAgIyBsb2FkIGZvcm1hdCBiYWNrZW5kCiAgICBteSAkRm9ybWF0QmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEZvcm1hdEJhY2tlbmQ7CgogICAgIyBnZXQgaW1wb3J0IGRhdGEKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmQtPkltcG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkUGFyYW17U291cmNlQ29udGVudH0sCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkSW1wb3J0RGF0YTsKCiAgICBteSAlUmVzdWx0OwogICAgJFJlc3VsdHtTdWNjZXNzfSA9IDA7CiAgICAkUmVzdWx0e0ZhaWxlZH0gID0gMDsKCiAgICBJTVBPUlREQVRBUk9XOgogICAgZm9yIG15ICRJbXBvcnREYXRhUm93ICggQHskSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICMgaW1wb3J0IG9uZSByb3cKICAgICAgICBteSAkU3VjY2VzcyA9ICRPYmplY3RCYWNrZW5kLT5JbXBvcnREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gJEltcG9ydERhdGFSb3csCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRSZXN1bHR7RmFpbGVkfSsrOwogICAgICAgICAgICBuZXh0IElNUE9SVERBVEFST1c7CiAgICAgICAgfQoKICAgICAgICAkUmVzdWx0e1N1Y2Nlc3N9Kys7CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0IG9mICRSZXN1bHR7RmFpbGVkfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IGZhaWxlZCEiLAogICAgKTsKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJJbXBvcnQgb2YgJFJlc3VsdHtTdWNjZXNzfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IHN1Y2Nlc3MhIiwKICAgICk7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBfTG9hZEJhY2tlbmQoKQoKdG8gbG9hZCBhIGltcG9ydC9leHBvcnQgYmFja2VuZCBtb2R1bGUKCiAgICAkSGFzaFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldCcsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkQmFja2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIG9iamVjdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57TG9hZEJhY2tlbmR9LT57ICRQYXJhbXtNb2R1bGV9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0xvYWRCYWNrZW5kfS0+eyAkUGFyYW17TW9kdWxlfSB9OwoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRQYXJhbXtNb2R1bGV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtNb2R1bGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFBhcmFte01vZHVsZX0tPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRTZWxmLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17TW9kdWxlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIG9iamVjdAogICAgJFNlbGYtPntDYWNoZX0tPntMb2FkQmFja2VuZH0tPnsgJFBhcmFte01vZHVsZX0gfSA9ICRCYWNrZW5kT2JqZWN0OwoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKPWl0ZW0gX1N0cmluZ0NsZWFuKCkKCkRPTidUIFVTRSBUSElTIElOVEVSTkFMIEZVTkNUSU9OIElOIE9USEVSIE1PRFVMRVMhCgpUaGlzIGZ1bmN0aW9uIGNhbiBiZSByZXBsYWNlZCB3aXRoIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW06OlN0cmluZ0NsZWFuKCkgaW4gT1RSUyAyLjMgYW5kIGxhdGVyIQoKY2xlYW4gYSBnaXZlbiBzdHJpbmcKCiAgICBteSAkRXJyb3IgPSAkQ2hlY2tJdGVtT2JqZWN0LT5fU3RyaW5nQ2xlYW4oCiAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCdTdHJpbmcnLAogICAgICAgIFRyaW1MZWZ0ICAgICAgICAgID0+IDAsICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICAgICAgVHJpbVJpZ2h0ICAgICAgICAgPT4gMCwgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMAogICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAKICAgICk7Cgo9Y3V0CgpzdWIgX1N0cmluZ0NsZWFuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1N0cmluZ1JlZn0gfHwgcmVmICRQYXJhbXtTdHJpbmdSZWZ9IG5lICdTQ0FMQVInICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBhIHNjYWxhciByZWZlcmVuY2UhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxIGlmICEkeyAkUGFyYW17U3RyaW5nUmVmfSB9OwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkUGFyYW17VHJpbUxlZnR9ICA9IGRlZmluZWQgJFBhcmFte1RyaW1MZWZ0fSAgPyAkUGFyYW17VHJpbUxlZnR9ICA6IDE7CiAgICAkUGFyYW17VHJpbVJpZ2h0fSA9IGRlZmluZWQgJFBhcmFte1RyaW1SaWdodH0gPyAkUGFyYW17VHJpbVJpZ2h0fSA6IDE7CgogICAgbXkgJVRyaW1BY3Rpb24gPSAoCiAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gcXJ7IFtcblxyXGZdIH14bXMsCiAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gcXJ7IFx0ICAgICAgIH14bXMsCiAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gcXJ7IFsgXSAgICAgIH14bXMsCiAgICAgICAgVHJpbUxlZnQgICAgICAgICAgPT4gcXJ7IFxBIFxzKyAgIH14bXMsCiAgICAgICAgVHJpbVJpZ2h0ICAgICAgICAgPT4gcXJ7IFxzKyBceiAgIH14bXMsCiAgICApOwoKICAgIEFDVElPTjoKICAgIGZvciBteSAkQWN0aW9uICggc29ydCBrZXlzICVUcmltQWN0aW9uICkgewogICAgICAgIG5leHQgQUNUSU9OIGlmICEkUGFyYW17JEFjdGlvbn07CgogICAgICAgICR7ICRQYXJhbXtTdHJpbmdSZWZ9IH0gPX4gc3sgJFRyaW1BY3Rpb257JEFjdGlvbn0gfXt9eG1zZzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yNiAkICREYXRlOiAyMDA4LzA0LzE3IDExOjI5OjA0ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtIC0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBDU1YKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENTVi5wbSx2IDEuMjIuMi4xIDIwMDgvMDcvMjcgMTg6Mzk6MTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIyLjIuMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWIC0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBDU1YKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyB0byBpbXBvcnQgYW5kIGV4cG9ydCBhIGNzdiBmb3JtYXQKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRJbXBvcnRFeHBvcnRPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCBJbXBvcnRFeHBvcnRPYmplY3QpKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ1RleHQ6OkNTVicpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+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+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNvbWJpbmUgdGhlIGV4cG9ydCBkYXRhIHRvIGEgc3RyaW5nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIENTViBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkUGFyc2VPYmplY3QtPnN0cmluZzsKCiAgICByZXR1cm4gJFN0cmluZyBpZiAkQ2hhcnNldCBuZSAnVVRGLTgnOwoKICAgICMgc2V0IHV0ZjggZmxhZwogICAgRW5jb2RlOjpfdXRmOF9vbigkU3RyaW5nKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yMi4yLjEgJCAkRGF0ZTogMjAwOC8wNy8yNyAxODozOToxMyAkCgo9Y3V0Cg==
IyAtLQojIEltcG9ydEV4cG9ydC50IC0gYWxsIGdlbmVyYWwgaW1wb3J0IGV4cG9ydCB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnQsdiAxLjE0IDIwMDgvMDQvMDcgMTA6MTY6MzYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKJFNlbGYtPntFbmNvZGVPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMiApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnSW1wb3J0RXhwb3J0JyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUltcG9ydEV4cG9ydC0nIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJ1VuaXRUZXN0LUltcG9ydEV4cG9ydC0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCiAgICApOwp9CgojIGNyZWF0ZSBuZWVkZWQgcmFuZG9tIHRlbXBsYXRlIG5hbWVzCm15IEBUZW1wbGF0ZU5hbWU7Cgpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDUgKSB7CgogICAgcHVzaCBAVGVtcGxhdGVOYW1lLCAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwOwp9CgojIGNyZWF0ZSBuZWVkZWQgcmFuZG9tIG9iamVjdCBuYW1lcwpteSBAT2JqZWN0TmFtZTsKcHVzaCBAT2JqZWN0TmFtZSwgJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKCiMgY3JlYXRlIG5lZWRlZCBmb3JtYXQgbmFtZXMKbXkgQEZvcm1hdE5hbWUgPSAoJ0NTVicpOwoKIyBnZXQgb3JpZ2luYWwgdGVtcGxhdGUgbGlzdCBmb3IgbGF0ZXIgY2hlY2tzIChhbGwgZWxlbWVudHMpCm15ICRUZW1wbGF0ZUxpc3QxQWxsID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgZ2V0IG9yaWdpbmFsIHRlbXBsYXRlIGxpc3QgZm9yIGxhdGVyIGNoZWNrcyAoYWxsIGVsZW1lbnRzKQpteSAkVGVtcGxhdGVMaXN0MU9iamVjdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEl0ZW1EYXRhID0gWwoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgb25lIHRlc3QgYmVmb3JlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnVGVzdENvbW1lbnQnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0sCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0Q29tbWVudCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTInLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUzJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnVGVzdENvbW1lbnQgVVBEQVRFMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0Q29tbWVudCBVUERBVEUzJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTQnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAiIFx0IFxuIFxyICIgLiAkT2JqZWN0TmFtZVswXSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgRm9ybWF0ICA9PiAiIFx0IFxuIFxyICIgLiAkRm9ybWF0TmFtZVswXSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyICIgLiAkVGVtcGxhdGVOYW1lWzJdIC4gIiBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzJdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50JywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSB0ZW1wbGF0ZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyICIgLiAkVGVtcGxhdGVOYW1lWzJdIC4gIlVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsyXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAnIMaVIMaYICcgLiAkT2JqZWN0TmFtZVswXSAuICcgxrUgxrsgJywKICAgICAgICAgICAgRm9ybWF0ICA9PiAnIMeTIMejICcgLiAkRm9ybWF0TmFtZVswXSAuICcgx6Ugx64gJywKICAgICAgICAgICAgTmFtZSAgICA9PiAnIMe3IMicICcgLiAkVGVtcGxhdGVOYW1lWzNdIC4gJyDIniDIoCAnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJ8aVxpgnIC4gJE9iamVjdE5hbWVbMF0gLiAnxrXGuycsCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICfHk8ejJyAuICRGb3JtYXROYW1lWzBdIC4gJ8elx64nLAogICAgICAgICAgICBOYW1lICAgICA9PiAnx7cgyJwgJyAuICRUZW1wbGF0ZU5hbWVbM10gLiAnIMieIMigJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ9GgINGkIFRlc3RDb21tZW50NSDPoCDOqScsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15IEBBZGRlZFRlbXBsYXRlSURzOwoKVEVNUExBVEU6CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IHRlbXBsYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKCAleyAkSXRlbS0+e0FkZH0gfSApOwoKICAgICAgICBpZiAoJFRlbXBsYXRlSUQpIHsKICAgICAgICAgICAgcHVzaCBAQWRkZWRUZW1wbGF0ZUlEcywgJFRlbXBsYXRlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRlbXBsYXRlIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e0FkZEdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUFkZCgpIC0gVGVtcGxhdGVLZXk6ICRUZW1wbGF0ZUlEIgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKCAkVGVtcGxhdGVJRCwgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVBZGQoKSIgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e0FkZEdldH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0ZW1wbGF0ZSB3YXMgYWRkZWQKICAgICAgICBteSAkVGVtcGxhdGVHZXQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRBZGRlZFRlbXBsYXRlSURzWy0xXSwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57QWRkfS0+e1VzZXJJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEgYWZ0ZXIgY3JlYXRpb24gb2YgdGVtcGxhdGUKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlR2V0LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUdldCgpIC0gJFRlbXBsYXRlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgbGFzdCB0ZW1wbGF0ZSBpZCB2YXJhaWJsZQogICAgICAgIGlmICggISRBZGRlZFRlbXBsYXRlSURzWy0xXSApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5PIExBU1QgSVRFTSBJRCBHSVZFTi4gUGxlYXNlIGFkZCBhIHRlbXBsYXRlIGZpcnN0LiIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbGFzdCBURU1QTEFURTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSB0ZW1wbGF0ZQogICAgICAgIG15ICRVcGRhdGVTdWNlc3MgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlVXBkYXRlKCkgLSBUZW1wbGF0ZUtleTogJEFkZGVkVGVtcGxhdGVJRHNbLTFdIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e1VwZGF0ZX0tPntVc2VySUR9IHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhIGFmdGVyIHVwZGF0ZQogICAgICAgIGZvciBteSAkVGVtcGxhdGVBdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVHZXQtPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlR2V0KCkgLSAkVGVtcGxhdGVBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQpjb250aW51ZSB7CgogICAgIyBpbmNyZW1lbnQgdGhlIGNvdW50ZXIKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlTGlzdCB0ZXN0IDEgKGNoZWNrIGFycmF5IHJlZmVyZW5jZXMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgbGlzdCBtdXN0IGJlIGFuIGVtcHR5IGFycmF5IHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkVGVtcGxhdGVMaXN0MUFsbCBlcSAnQVJSQVknICYmIHJlZiAkVGVtcGxhdGVMaXN0MU9iamVjdCBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVMaXN0KCkgLSBhcnJheSByZWZlcmVuY2VzIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZUxpc3QgdGVzdCAyIChsaXN0IG11c3QgYmUgZW1wdHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgbGlzdCBtdXN0IGJlIGFuIGVtcHR5IGxpc3QKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVMaXN0MU9iamVjdH0gZXEgMCwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gZW1wdHkgbGlzdCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVMaXN0IHRlc3QgMiAoY2hlY2sgY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZUxpc3QyID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgbGlzdCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkVGVtcGxhdGVMaXN0MiBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVMaXN0KCkgLSBhcnJheSByZWZlcmVuY2UiLAopOwoKbXkgJFRlbXBsYXRlTGlzdENvdW50ID0gc2NhbGFyIEB7JFRlbXBsYXRlTGlzdDJ9IC0gc2NhbGFyIEB7JFRlbXBsYXRlTGlzdDFBbGx9OwoKIyBjaGVjayBjb3JyZWN0IG51bWJlciBvZiBuZXcgaXRlbXMKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVMaXN0Q291bnQgZXEgc2NhbGFyIEBBZGRlZFRlbXBsYXRlSURzLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVMaXN0KCkgLSBjb3JyZWN0IG51bWJlciBvZiBuZXcgaXRlbXMiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlRGVsZXRlIHRlc3QgMSAoYWRkIG9uZSB0ZW1wbGF0ZSBhbmQgZGVsZXRlIGl0KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZURlbGV0ZTFMaXN0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGFkZCBhIHRlc3QgdGVtcGxhdGUKbXkgJFRlbXBsYXRlRGVsZXRlSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbNF0sCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZURlbGV0ZTFMaXN0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBoYXZlIG9uZSBtb3JlIGVsZW1lbnQKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDF9IGVxICggc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QyfSApIC0gMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkgLSBudW1iZXIgb2YgbGlzdGVkIGVsZW1lbnRzIiwKKTsKCiMgZGVsZXRlIHRoZSBuZXcgdGVtcGxhdGUKbXkgJFRlbXBsYXRlRGVsZXRlMSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURlbGV0ZUlELAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBsaXN0IG11c3QgYmUgc3VjY2Vzc2Z1bGwKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVEZWxldGUxLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSIsCik7CgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZURlbGV0ZTFMaXN0MyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBoYXZlIHRoZSBvcmlnaW5hbCBudW1iZXIgb2YgZWxlbWVudHMKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDF9IGVxIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0M30sCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIC0gbnVtYmVyIG9mIGxpc3RlZCBlbGVtZW50cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVEZWxldGUgdGVzdCAyIChkZWxldGUgYWxsIHVuaXR0ZXN0IHRlbXBsYXRlcykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRUZW1wbGF0ZUlEIChAQWRkZWRUZW1wbGF0ZUlEcykgewoKICAgICMgZGVsZXRlIHRoZSB0ZW1wbGF0ZQogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIHN1Y2Nlc3MKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkgVGVtcGxhdGVJRCAkVGVtcGxhdGVJRCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE9iamVjdExpc3QgdGVzdCAxIChjaGVjayBnZW5lcmFsIGZ1bmN0aW9uYWxpdHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVmaW5lIHRlc3QgbGlzdApteSAkT2JqZWN0TGlzdDFUZXN0TGlzdCA9IHsKICAgIFVuaXRUZXN0MSA9PiB7CiAgICAgICAgTW9kdWxlID0+ICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpVbml0VGVzdDEnLAogICAgICAgIE5hbWUgICA9PiAnVW5pdCBUZXN0IDEnLAogICAgfSwKICAgIFVuaXRUZXN0MiA9PiB7CiAgICAgICAgTW9kdWxlID0+ICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpVbml0VGVzdDInLAogICAgICAgIE5hbWUgICA9PiAnVW5pdCBUZXN0IDInLAogICAgfSwKfTsKCiMgZ2V0IG9yaWdpbmFsIG9iamVjdCBsaXN0Cm15ICRPYmplY3RMaXN0T3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKIyBzZXQgdGVzdCBsaXN0CiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicsCiAgICBWYWx1ZSA9PiAkT2JqZWN0TGlzdDFUZXN0TGlzdCwKKTsKCiMgZ2V0IG9iamVjdCBsaXN0Cm15ICRPYmplY3RMaXN0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKIyBsaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkT2JqZWN0TGlzdDEgZXEgJ0hBU0gnLAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0TGlzdCgpIC0gaGFzaCByZWZlcmVuY2UiLAopOwoKIyBjaGVjayB0aGUgbGlzdApLRVk6CmZvciBteSAkS2V5ICgga2V5cyAleyRPYmplY3RMaXN0MX0gKSB7CgogICAgaWYgKCAhJE9iamVjdExpc3QxVGVzdExpc3QtPnskS2V5fSApIHsKICAgICAgICAkT2JqZWN0TGlzdDFUZXN0TGlzdC0+e0R1bW15fSA9IDE7CiAgICB9CgogICAgbmV4dCBLRVkgaWYgJE9iamVjdExpc3QxLT57JEtleX0gbmUgJE9iamVjdExpc3QxVGVzdExpc3QtPnskS2V5fS0+e05hbWV9OwoKICAgIGRlbGV0ZSAkT2JqZWN0TGlzdDFUZXN0TGlzdC0+eyRLZXl9Owp9CgokU2VsZi0+VHJ1ZSgKICAgICEleyRPYmplY3RMaXN0MVRlc3RMaXN0fSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IE9iamVjdExpc3QoKSAtIGNvbnRlbnQgaXMgdmFsaWQiLAopOwoKIyByZXN0b3JlIG9yaWdpbmFsIG9iamVjdCBsaXN0CiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicsCiAgICBWYWx1ZSA9PiAkT2JqZWN0TGlzdE9yZywKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRMaXN0IHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSB0ZXN0IGxpc3QKbXkgJEZvcm1hdExpc3QxVGVzdExpc3QgPSB7CiAgICBVbml0VGVzdDEgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6VW5pdFRlc3QxJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAxJywKICAgIH0sCiAgICBVbml0VGVzdDIgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6VW5pdFRlc3QyJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAyJywKICAgIH0sCn07CgojIGdldCBvcmlnaW5hbCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdE9yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiMgc2V0IHRlc3QgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJEZvcm1hdExpc3QxVGVzdExpc3QsCik7CgojIGdldCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiMgbGlzdCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJEZvcm1hdExpc3QxIGVxICdIQVNIJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdExpc3QoKSAtIGhhc2ggcmVmZXJlbmNlIiwKKTsKCiMgY2hlY2sgdGhlIGxpc3QKS0VZOgpmb3IgbXkgJEtleSAoIGtleXMgJXskRm9ybWF0TGlzdDF9ICkgewoKICAgIGlmICggISRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0gKSB7CiAgICAgICAgJEZvcm1hdExpc3QxVGVzdExpc3QtPntEdW1teX0gPSAxOwogICAgfQoKICAgIG5leHQgS0VZIGlmICRGb3JtYXRMaXN0MS0+eyRLZXl9IG5lICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0tPntOYW1lfTsKCiAgICBkZWxldGUgJEZvcm1hdExpc3QxVGVzdExpc3QtPnskS2V5fTsKfQoKJFNlbGYtPlRydWUoCiAgICAhJXskRm9ybWF0TGlzdDFUZXN0TGlzdH0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBjb250ZW50IGlzIHZhbGlkIiwKKTsKCiMgcmVzdG9yZSBvcmlnaW5hbCBmb3JtYXQgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJEZvcm1hdExpc3RPcmcsCik7CgokVGVzdENvdW50Kys7CgoxOwo=
IyAtLQojIEltcG9ydEV4cG9ydEZvcm1hdENTVi50IC0gYWxsIGltcG9ydCBleHBvcnQgdGVzdHMgZm9yIHRoZSBDU1YgZm9ybWF0IGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydEZvcm1hdENTVi50LHYgMS43IDIwMDgvMDQvMTQgMTU6MDI6MjEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVjsKCiRTZWxmLT57RW5jb2RlT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57Rm9ybWF0QmFja2VuZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YtPm5ldyggJXskU2VsZn0gKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBob21lIGRpcmVjdG9yeQokU2VsZi0+e0hvbWV9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKCiMgYWRkIHNvbWUgdGVzdCB0ZW1wbGF0ZXMgZm9yIGxhdGVyIGNoZWNrcwpteSBAVGVtcGxhdGVJRHM7CmZvciAoIDEgLi4gMzAgKSB7CgogICAgIyBhZGQgYSB0ZXN0IHRlbXBsYXRlIGZvciBsYXRlciBjaGVja3MKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgRm9ybWF0ICA9PiAnQ1NWJywKICAgICAgICBOYW1lICAgID0+ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgcHVzaCBAVGVtcGxhdGVJRHMsICRUZW1wbGF0ZUlEOwp9CgpteSAkVGVzdENvdW50ID0gMTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRMaXN0IHRlc3QgMSAoY2hlY2sgQ1NWIGl0ZW0pCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBsaXN0Cm15ICRGb3JtYXRMaXN0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKIyBjaGVjayBmb3JtYXQgbGlzdAokU2VsZi0+VHJ1ZSgKICAgICRGb3JtYXRMaXN0MSAmJiByZWYgJEZvcm1hdExpc3QxIGVxICdIQVNIJyAmJiAkRm9ybWF0TGlzdDEtPntDU1Z9LAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0TGlzdCgpIC0gQ1NWIGV4aXN0cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgYXR0cmlidXRlcwpteSAkRm9ybWF0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZm9ybWF0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDEgJiYgcmVmICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiMgZGVmaW5lIHRoZSByZWZlcmVuY2UgaGFzaApteSAkRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UgPSBbCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NvbHVtblNlcGVyYXRvcicsCiAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbiBTZXBlcmF0b3InLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUYWJ1bGF0b3IgPT4gJ1RhYnVsYXRvciAoVEFCKScsCiAgICAgICAgICAgICAgICBTZW1pY29sb24gPT4gJ1NlbWljb2xvbiAoOyknLAogICAgICAgICAgICAgICAgQ29sb24gICAgID0+ICdDb2xvbiAoOiknLAogICAgICAgICAgICAgICAgRG90ICAgICAgID0+ICdEb3QgKC4pJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ2hhcnNldCcsCiAgICAgICAgTmFtZSAgPT4gJ0NoYXJzZXQnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDIwLAogICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gMjAsCiAgICAgICAgfSwKICAgIH0sCl07CgojIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiMgZHVtcCB0aGUgbGlzdCBmcm9tIEZvcm1hdEF0dHJpYnV0ZXNHZXQoKQpteSAkRm9ybWF0QXR0cmlidXRlc0dldER1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJEZvcm1hdEF0dHJpYnV0ZXNHZXQxKTsKCiMgZHVtcCB0aGUgcmVmZXJlbmNlIHRhYmxlCm15ICRGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UpOwoKJFNlbGYtPlRydWUoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldER1bXAxIGVxICRGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBhdHRyaWJ1dGVzIG9mIHRoZSByb3cgYXJlIGlkZW50aWNhbCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgYXR0cmlidXRlcwpteSAkRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmYWxzZSByZXR1cm4KJFNlbGYtPkZhbHNlKAogICAgJEZvcm1hdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMF0sCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIG1hcHBpbmcgZm9ybWF0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxICYmIHJlZiAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiMgZGVmaW5lIHRoZSByZWZlcmVuY2UgaGFzaApteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlID0gWwogICAgewogICAgICAgIEtleSAgID0+ICdDb2x1bW4nLAogICAgICAgIE5hbWUgID0+ICdDb2x1bW4nLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0RUTCcsCiAgICAgICAgICAgIERhdGEgICAgID0+ICckUURhdGF7IkNvdW50ZXIifScsCiAgICAgICAgICAgIFJlcXVpcmVkID0+IDAsCiAgICAgICAgfSwKICAgIH0sCl07CgojIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiMgZHVtcCB0aGUgbGlzdCBmcm9tIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxKTsKCiMgZHVtcCB0aGUgcmVmZXJlbmNlIHRhYmxlCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc1JlZkR1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSk7CgokU2VsZi0+VHJ1ZSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldER1bXAxIGVxICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc1JlZkR1bXAxLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGF0dHJpYnV0ZXMgb2YgdGhlIHJvdyBhcmUgaWRlbnRpY2FsIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZmFsc2UgcmV0dXJuCiRTZWxmLT5GYWxzZSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDIsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBJbXBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJbXBvcnREYXRhVGVzdHMgPSBbCgogICAgIyBJbXBvcnREYXRhR2V0IGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBJbXBvcnREYXRhR2V0IGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBzb3VyY2UgY29udGVudCBhcmUgZ2l2ZW4gKGVtcHR5IGFycmF5IHJlZmVyZW5jZSBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbXSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBbXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IG11c3QgYmUgYSBzY2FsYXIgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IHt9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gc2VwZXJhdG9yIGFuZCBjaGFyc2V0IGFyZSBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIHNlcGVyYXRvciBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENoYXJzZXQgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNoYXJzZXQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgY29sdW1uIHNlcGVyYXRvciBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIGJ1dCBzb3VyY2UgY29udGVudCBpcyBlbXB0eSAoZW1wdHkgYXJyYXkgcmVmZXJlbmNlIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbM10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7Jyd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbXSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBpcyBvbmx5IGEgc3RyaW5nIHdpdGggc3BhY2VzIChvbmUgY2VsbCBhcnJheSB3aXRoIHRoZSBzcGFjZXMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s0XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnICAnfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbJyAgJ10sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuLCBidXQgVGFidWxhdG9yIGlzIHVzZWQgYXMgc2VwZXJhdG9yIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbJ1JvdzEtQ29sMTtSb3cxLUNvbDI7Um93MS1Db2wzJ10sCiAgICAgICAgICAgIFsnUm93Mi1Db2wxO1JvdzItQ29sMjtSb3cyLUNvbDMnXSwKICAgICAgICAgICAgWydSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMyddLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiwgYnV0IFNlbWljb2xvbiBpcyB1c2VkIGFzIHNlcGVyYXRvciAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyJSb3cxLUNvbDFcdFJvdzEtQ29sMlx0Um93MS1Db2wzIl0sCiAgICAgICAgICAgIFsiUm93Mi1Db2wxXHRSb3cyLUNvbDJcdFJvdzItQ29sMyJdLAogICAgICAgICAgICBbIlJvdzMtQ29sMVx0Um93My1Db2wyXHRSb3czLUNvbDMiXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAnVGVzdCAxIC0gMicsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgIlRlc3QgMSAtIDIiLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoSVNPLTg4NTkgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA2LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMTBdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnyqkgyqwgyq4nLCAgICAgJyDKoSDLpCDOjCAnIF0sCiAgICAgICAgICAgIFsgJyAgzpcgz5cgz6AgICcsICfOhiDOmyDOnicgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNi1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNi1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMTBdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnyqkgyqwgyq4nLCAgICAgJyDKoSDLpCDOjCAnIF0sCiAgICAgICAgICAgIFsgJyAgzpcgz5cgz6AgICcsICfOhiDOmyDOnicgXSwKICAgICAgICBdLAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBJbXBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKClRFU1Q6CmZvciBteSAkVGVzdCAoIEB7JEltcG9ydERhdGFUZXN0c30gKSB7CgogICAgIyBjaGVjayBTb3VyY2VJbXBvcnREYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSB8fCByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBObyBTb3VyY2VJbXBvcnREYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IEltcG9ydERhdGFHZXQKICAgIGlmICggISRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fSApIHsKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gPSB7fTsKICAgIH0KCiAgICAjIHNldCBzb3VyY2UgY29udGVudAogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntTb3VyY2VGaWxlfQogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9CiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57U291cmNlQ29udGVudH0gZXEgJ1NvdXJjZUZpbGUnCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkU291cmNlRmlsZSA9ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntTb3VyY2VGaWxlfTsKCiAgICAgICAgIyByZWFkIHNvdXJjZSBmaWxlCiAgICAgICAgbXkgJFNvdXJjZUNvbnRlbnQgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJFNlbGYtPntIb21lfSAuICcvc2NyaXB0cy90ZXN0L3NhbXBsZS8nIC4gJFNvdXJjZUZpbGUsCiAgICAgICAgICAgIFJlc3VsdCAgID0+ICdTQ0FMQVInLAogICAgICAgICAgICBNb2RlICAgICA9PiAnYmlubW9kZScsCiAgICAgICAgKTsKCiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57U291cmNlQ29udGVudH0gPSAkU291cmNlQ29udGVudDsKICAgIH0KCiAgICAjIHNldCB0aGUgZm9ybWF0IGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57Rm9ybWF0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0Zvcm1hdERhdGF9IGVxICdIQVNIJwogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgZm9ybWF0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBGb3JtYXREYXRhID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntGb3JtYXREYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaW1wb3J0IGRhdGEKICAgIG15ICRJbXBvcnREYXRhID0gJFNlbGYtPntGb3JtYXRCYWNrZW5kT2JqZWN0fS0+SW1wb3J0RGF0YUdldCgKICAgICAgICAleyAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gfSwKICAgICk7CgogICAgaWYgKCAhJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSApIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkSW1wb3J0RGF0YSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoIHJlZiAkSW1wb3J0RGF0YSBuZSAnQVJSQVknICkgewoKICAgICAgICAjIGNoZWNrIGFycmF5IHJlZmVyZW5jZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSByZXR1cm4gdmFsdWUgaXMgYW4gYXJyYXkgcmVmZXJlbmNlIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBjaGVjayBudW1iZXIgb2Ygcm93cwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyRJbXBvcnREYXRhfSwKICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSB9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHNhbWUgbnVtYmVyIG9mIHJvd3MiLAogICAgKTsKCiAgICAjIGNoZWNrIGNvbnRlbnQgb2YgaW1wb3J0IGRhdGEKICAgIG15ICRDb3VudGVyUm93ID0gMDsKICAgIFJPVzoKICAgIGZvciBteSAkSW1wb3J0Um93ICggQHskSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICMgZXh0cmFjdCByZWZlcmVuY2Ugcm93CiAgICAgICAgbXkgJFJlZmVyZW5jZVJvdyA9ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPlskQ291bnRlclJvd107CgogICAgICAgIGlmICggcmVmICRJbXBvcnRSb3cgbmUgJ0FSUkFZJyB8fCByZWYgJFJlZmVyZW5jZVJvdyBuZSAnQVJSQVknICkgewoKICAgICAgICAgICAgIyBjaGVjayBhcnJheSByZWZlcmVuY2UKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gaW1wb3J0IHJvdyBhbmQgcmVmZXJlbmNlIHJvdyBtYXRjaGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVEVTVDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGNvbHVtbnMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRJbXBvcnRSb3d9LAogICAgICAgICAgICBzY2FsYXIgQHskUmVmZXJlbmNlUm93fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gc2FtZSBudW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvdW50ZXJDb2x1bW4gPSAwOwogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JEltcG9ydFJvd30gKSB7CgogICAgICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQ2VsbCApIHsKICAgICAgICAgICAgICAgICRDZWxsID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0gKSB7CiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjZWxsIGRhdGEKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJENlbGwsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpICIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnRlckNvbHVtbisrOwogICAgICAgIH0KCiAgICAgICAgJENvdW50ZXJSb3crKzsKICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBFeHBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkRXhwb3J0RGF0YVRlc3RzID0gWwoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBFeHBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBFeHBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgcm93IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4ge30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gc2VwZXJhdG9yIGFuZCBjaGFyc2V0IGFyZSBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBzZXBlcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY2hhcnNldCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgY29sdW1uIHNlcGVyYXRvciBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSBvbmUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzIChvbmUgZW1wdHkgY2VsbCBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiI7IiI7IiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlwiXCJcdFwiXCJcdFwiXCIiLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiI6IiI6IiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiLiIiLiIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnOyIiOycsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlx0XCJcIlx0IiwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgdW5kZWYsICcnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICc6IiI6JywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnLiIiLicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciUm93MS1Db2wxIjsiUm93MS1Db2wyIjsiUm93MS1Db2wzIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIlJvdzEtQ29sMVwiXHRcIlJvdzEtQ29sMlwiXHRcIlJvdzEtQ29sM1wiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSIuIlJvdzEtQ29sMiIuIlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIjsiVGVzdCBcbiAyIjsiVGVzdCAzIFxcblxcdFxcclxccyI7IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICBxcXsiXG5UZXN0IDEiXHQiVGVzdCBcbiAyIlx0IlRlc3QgMyBcXG5cXHRcXHJcXHMiXHQiVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIjoiVGVzdCBcbiAyIjoiVGVzdCAzIFxcblxcdFxcclxccyI6IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiBxcXsiXG5UZXN0IDEiLiJUZXN0IFxuIDIiLiJUZXN0IDMgXFxuXFx0XFxyXFxzIi4iVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciICBUZXN0ICAiOyIgICAgIjsiVGVzdCAgIjsiICAgIFRlc3QiOyIiOyJUZXN0IjsiIjsiICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgIlwiICBUZXN0ICBcIlx0XCIgICAgXCJcdFwiVGVzdCAgXCJcdFwiICAgIFRlc3RcIlx0XCJcIlx0XCJUZXN0XCJcdFwiXCJcdFwiIFwiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIgIFRlc3QgICI6IiAgICAiOiJUZXN0ICAiOiIgICAgVGVzdCI6IiI6IlRlc3QiOiIiOiIgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIi4iICAgICIuIlRlc3QgICIuIiAgICBUZXN0Ii4iIi4iVGVzdCIuIiIuIiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI7Ij48QH5cJ317W11cIjsiIjsiIiIiIjs7OjouLi0tX18jIyInCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiJwogICAgICAgICAgICAuICJcdCIKICAgICAgICAgICAgLiAnIj48QH5cJ317W11cXCInCiAgICAgICAgICAgIC4gIlx0IgogICAgICAgICAgICAuICciIicKICAgICAgICAgICAgLiAiXHQiCiAgICAgICAgICAgIC4gJyIiIiIiOzs6Oi4uLS1fXyMjIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI6Ij48QH5cJ317W11cIjoiIjoiIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol9eISIkJSYvKCk9P2AqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICc+PEB+XCd9e1tdXFwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICAnIlRlc3Q7Ol9eISIiJCUmLygpPT9gKitUZXN0Ii4iPjxAflwnfXtbXVxcIi4iIi4iIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiDRqiDRrCDRsiI7ItGvING0ING/Ijsi0oIg0oog0pYgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBlcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIiDRqiDRrCDRslwiXHRcItGvING0ING/XCJcdFwi0oIg0oog0pYgXCIiLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwZXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciINGqINGsINGyIjoi0a8g0bQg0b8iOiLSgiDSiiDSliAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGVyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyDRqiDRrCDRsicsICfRryDRtCDRvycsICfSgiDSiiDSliAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIg0aog0awg0bIiLiLRryDRtCDRvyIuItKCINKKINKWICInLAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpURVNUOgpmb3IgbXkgJFRlc3QgKCBAeyRFeHBvcnREYXRhVGVzdHN9ICkgewoKICAgICMgY2hlY2sgU291cmNlRXhwb3J0RGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU291cmNlRXhwb3J0RGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBFeHBvcnREYXRhU2F2ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSApIHsKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9ID0ge307CiAgICB9CgogICAgIyBzZXQgdGhlIGZvcm1hdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0Zvcm1hdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgc2F2ZSBmb3JtYXQgZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBGb3JtYXREYXRhID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZXhwb3J0IGRhdGEgcm93CiAgICBteSAkRXhwb3J0U3RyaW5nID0gJFNlbGYtPntGb3JtYXRCYWNrZW5kT2JqZWN0fS0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSB9LAogICAgKTsKCiAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRFeHBvcnRTdHJpbmcsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkgLSByZXR1cm4gZmFsc2UiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJEV4cG9ydFN0cmluZyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e0V4cG9ydERhdGFSb3d9ICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgZGVmaW5lZCAkRXhwb3J0U3RyaW5nLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBleHBvcnQgc3RyaW5nCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEV4cG9ydFN0cmluZywKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNsZWFuIHRoZSBzeXN0ZW0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWxldGUgdGhlIHRlc3QgdGVtcGxhdGVzCiRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICBUZW1wbGF0ZUlEID0+IFxAVGVtcGxhdGVJRHMsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgoxOwo=
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==