GeneralCatalog
1.3.2
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 1.3.2.
Build for OTRS::ITSM 1.3.1.
The general catalog package.
Das General Catalog Paket.
2.4.x
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from this table will be irrevocably lost.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
((enjoy))<br>
<br>
2009-10-15 13:59:26
opms.otrs.com
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xuPxZDJ5OFv01DRWHMelUqn4h2zHonw+/86BAQAAAN7fVvdHt7e3g8HgqxsLhULxG6oiAAAAYGttbH80n8/Pz88Xi8Vf//rXp66pVCpRFH1VFS3ZFRsAAABgC61ff5QkSbYn0Xw+L5VK1Wr10ctyudx4PM6uz+Vyj16zv7//hkEBAAAANsKK9kdpms7/kLVF951RkiT3l+3u7i7pjz58+FAqlZ4qjwAAAAB4jsD9UZqm0+n0YT10/8GS78rn89kuReVyecllzWbztfMCAAAAbJ3A/dFoNPr8+fOjX4rjuFAoZD3R/Z8ZI0UAAADA67rfEDk7nP3hp0u+9Pw7Wf6Iy68M7m37o8vLy7u7u5OTk52dnccfvlC4HyZ6WBI58gwAAAB4T181PtE3tc5TX/r2fp5qkZY84vIrg3tuf5QkyXw+XywW99sSZR+nafqXv/zlqe/KnvxisXjqglKp9D//8z8/GhoAAAAgoIdFz/NHh1Z8yGiJ//RHSZJ8Ww/df/xw1+rn29/f39/fLxRWdJduAAAAgMzDOaDlnrM27eHd3l/w1ZVfPeLDK1dNIYqiT58+TSaT7zZE9xsS3S86yyz5lmKx+JphAQAAAN7SwxLn0SGj6HurzH50Ddoq10b3ClEU3Y8X5XK5+2LoYUOUfWzXagAAAGBTfVXiPPx0yZeW38kPXbzKLVKcpul4PM7lchoiAAAAAL61BiNSAAAAAARk4AgAAACAZfRHAAAAACyjPwIAAABgGf0RAAAAAMvojwAAAABY5v8D3nWRn2MVBTEAAAAASUVORK5CYII=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBHZW5lcmFsQ2F0YWxvZy54bWwsdiAxLjMgMjAwOC8wMS8yMyAwODo1ODoyNiBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluR2VuZXJhbENhdGFsb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5HZW5lcmFsQ2F0YWxvZyBLb25maWd1cmF0aW9uIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5HZW5lcmFsIENhdGFsb2c8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+R2VuZXJhbCBDYXRhbG9nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazM8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTWlsZW4gS291dGV2CiMgLS0KIyAkSWQ6IGJnX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xMSAyMDA5LzA1LzE4IDA5OjQwOjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfO8e3u4uXtIOrg8uDr7uMnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfT7/Dg4uvl7ejlIO3gIO7x7e7i7ej/IOrg8uDr7uMnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICfK6+Dx7uLlIOIg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfE7uHg4ugg7e7iIOrr4PEg4iDq4PLg6+7j4C4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICfE7uHg4ugg5evl7OXt8iDq+uwg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfE7uHg4ugg6uvg8SDiIOrg8uDr7uPgJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAn1PPt6vbo7u3g6+3u8fInOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBjYXRhbGFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBTaXN0ZW1lcyBPVElDIChpYnNhbHV0KSAtIEFudG9uaW8gTGluZGUKIyAtLQojICRJZDogY3RfR2VuZXJhbENhdGFsb2cucG0sdiAxLjMgMjAwOS8wNS8xOCAwOTo0MDo0NiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdDYXTgbGVnIGdlbmVyYWwnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0afMgZGVsIGNhdOBsZWcgZ2VuZXJhbCc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0NsYXNzZSBkZSBjYXThbGVnJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnQWZlZ2lyIHVuYSBub3ZhIGNsYXNzZSBkZSBjYXTgbGVnJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnQWZlZ2lyIGFydGljbGUgZGUgY2F04GxlZyc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ0FmZWdpciBjbGFzc2UgZGUgY2F04GxlZyc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0Z1bmNpb25hbGl0YXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyAtLQojICRJZDogY3pfR2VuZXJhbENhdGFsb2cucG0sdiAxLjEwIDIwMDkvMDcvMjAgMTI6MTk6MDcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3pfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ1a5ZW9iZWNu/SBrYXRhbG9nJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn2O16ZW7tIHa5ZW9iZWNu6WhvIGthdGFsb2d1JzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnVPjtZHkgdiBrYXRhbG9ndSc7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ1D4aWRhdCBub3ZvdSB0+O1kdSBkbyBrYXRhbG9ndS4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdQ+GlkYXQgcHJ2ZWsgZG8ga2F0YWxvZ3UnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdQ+GlkYXQgdPjtZHUgZG8ga2F0YWxvZ3UnOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5rY2lvbmFsaXRhJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xNCAyMDA5LzA1LzE4IDA5OjQwOjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdHZW5lcmFsIENhdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0thdGFsb2cgS2xhc3NlJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnRWluZSBuZXVlIEthdGFsb2cgS2xhc3NlIGhpbnp1ZvxnZW4uJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnS2F0YWxvZyBFaW50cmFnIGhpbnp1ZvxnZW4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdLYXRhbG9nIEtsYXNzZSBoaW56dWb8Z2VuJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVua3Rpb25hbGl05HQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwZXJzaWFuIChmYXJzaSkgdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgQWZzaGFyIE1vaGViYmkgPGFmc2hhci5tb2hlYmJpIGF0IGdtYWlsLmNvbT4KIyAtLQojICRJZDogZmFfR2VuZXJhbENhdGFsb2cucG0sdiAxLjEgMjAwOS8wNy8yMCAwOTo1OTozNyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfZhdiv24zYsduM2Kog2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAn2YHZh9ix2LPYqiDaqdmE2KfYs9uMJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDZgdmH2LHYs9iqINqp2YTYp9iz24wuJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDbjNqpINmC2YTZhSDZgdmH2LHYs9iqJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDaqdmE2KfYsyDZgdmH2LHYs9iq24wnOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICfaqdin2LHaqdix2K/bjCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBmcmVuY2ggdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPbGl2aWVyIFNhbGxvdSA8b2xpdmllci5zYWxsb3UgYXQgaXJpc2EuZnI+CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmcl9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMS4yLjEgMjAwOS8wOC8wNCAxMjoyODoyMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmcl9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMS4yLjEgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnQ2F0YWxvZ3VlIEfpbulyYWwnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uIGR1IENhdGFsb2d1ZSBH6W7pcmFsJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnQ2xhc3NlIGRlIENhdGFsb2d1ZSc7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ0Fqb3V0ZXIgdW5lIG5vdXZlbGxlIGNsYXNzZXMgZGUgQ2F0YWxvZ3VlLic7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ0Fqb3V0ZXIgdW4gRWxlbWVudCBhdSBDYXRhbG9ndWUnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdBam91dGVyIHVuZSBDbGFzc2UgZGUgQ2F0YWxvZ3VlJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRm9uY3Rpb25uYWxpdOknOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBzcGFuaXNoIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBBcXVpbGVzIENvaGVuCiMgLS0KIyAkSWQ6IGVzX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS41IDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnQ2F0YWxvZ28gR2VuZXJhbCc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3Rp824gZGVsIENhdGFsb2dvIEdlbmVyYWwnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICdDbGFzZSBkZSBDYXRhbG9nbyc7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ0HxYWRpciB1bmEgbnVldmEgQ2xhc2UgYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdB8WFkaXIgRWxlbWVudG8gYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdB8WFkaXIgQ2xhc2UgYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5jaW9uYWxpZGFkJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBpdGFsaWFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBpdF9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMSAyMDA5LzA1LzE4IDA5OjM3OjAwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ0NhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbmUgZGVsIENhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnQ2xhc3NlIGRpIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnQWdnaXVuZ2kgdW5hIG51b3ZhIENsYXNzZSBhbCBDYXRhbG9nbyc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ0FnZ2l1bmdpIEVsZW1lbnRvIGFsIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnQWdnaXVuZ2kgQ2xhc3NlIGFsIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVuemlvbmFsaXTgJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBEdXRjaCB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwOSBNaWNoaWVsIEJlaWplbiA8bWljaGllbCAnYXQnIGJlZWZyZWVpdC5ubD4KIyAtLQojICRJZDogbmxfR2VuZXJhbENhdGFsb2cucG0sdiAxLjIgMjAwOS8wNy8yMCAxMzo0ODozMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdHZW5lcmFsIENhdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgQmVoZWVyJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnQ2F0YWxvZyBLbGFzc2UnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdFZW4gbmlldXdlIENhdGFsb2cgS2xhc3NlIHRvZXZvZWdlbic7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ0NhdGFsb2cgSXRlbSB0b2V2b2VnZW4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdDYXRhbG9nIEtsYXNzZSB0b2V2b2VnZW4nOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5jdGlvbmFsaXRlaXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwb2xpc2ggdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IE1hY2llaiBMb3N6YWpjCiMgLS0KIyAkSWQ6IHBsX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS40IDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnS2F0YWxvZyBns/N3bnknOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdaYXJ6sWR6YW5pZSBrYXRhbG9naWVtIGez83dueW0nOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICcnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdEb2RhaiBlbGVtZW50IGthdGFsb2d1JzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVua2Nqb25hbG5vtuYnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBydXNzaWFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBFZ29yIFRzaWxlbmtvIDxiZzhzIGF0IHN5bWxpbmsucnU+CiMgLS0KIyAkSWQ6IHJ1X0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4yIDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnzuH56Okg6uDy4Ovu4yc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9Pv8ODi6+Xt6OUg7uH56Owg6uDy4Ovu4+7sJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnyuvg8fEg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfE7uHg4ujy/CDt7uL76SDq6+Dx8SDq4PLg6+7j4Cc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ8Tu4eDi6+Xt6OUg/evl7OXt8uAg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfE7uHg4uvl7ejlIOrr4PHx4CDq4PLg6+7j4Cc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ9Tz7er26O7t4Ov87e7x8vwnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBDaGluZXNlIHNpbXBsZSB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogemhfQ05fR2VuZXJhbENhdGFsb2cucG0sdiAxLjEuMi4xIDIwMDkvMTAvMTQgMjA6NDI6MzQgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfQ05fR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEuMi4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ9fcxL/CvCc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9fcxL/CvLncwO0nOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICfEv8K8t9a8tic7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ9T2vNPSu7j20MLEv8K8t9a8tic7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ9T2vNPEv8K8z+7Evyc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ9T2vNPQwsS/wry31ry2JzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnuabE3NPDzb4nOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMjIgMjAwOS8wNS8xOCAwOTo0MDo0NiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yMiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgUGFyYW1PYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRhbG9nIGl0ZW0gbGlzdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0l0ZW1MaXN0JyApIHsKICAgICAgICBteSAkQ2xhc3MgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJDbGFzcyIgKSB8fCAnJzsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgY2xhc3MKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkgaWYgISRDbGFzczsKCiAgICAgICAgIyBnZXQgY2F0YWxvZyBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCAgICAgICA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc0xpc3QoKTsKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENsYXNzLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0l0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdmFpbGFiaWxpdHkgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CgogICAgICAgICMgZ2V0IGNhdGFsb2cgaXRlbSBsaXN0CiAgICAgICAgbXkgJEl0ZW1JRExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gbGlzdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkKICAgICAgICAgICAgaWYgISRJdGVtSURMaXN0IHx8ICEleyRJdGVtSURMaXN0fTsKCiAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgZm9yIG15ICRJdGVtSUQgKCBzb3J0IHsgJEl0ZW1JRExpc3QtPnskYX0gY21wICRJdGVtSURMaXN0LT57JGJ9IH0ga2V5cyAleyRJdGVtSURMaXN0fSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICMgZ2V0IGl0ZW0gZGF0YQogICAgICAgICAgICBteSAkSXRlbURhdGEgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgaXRlbSBsaXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0l0ZW1MaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEl0ZW1EYXRhfSwKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyAgICAgID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICRJdGVtRGF0YS0+e0Z1bmN0aW9uYWxpdHl9IHx8ICctJywKICAgICAgICAgICAgICAgICAgICBWYWxpZCAgICAgICAgID0+ICRWYWxpZExpc3R7ICRJdGVtRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBlZGl0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUVkaXQnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJJdGVtSUQiICk7CiAgICAgICAgaWYgKCAkSXRlbURhdGF7SXRlbUlEfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGNsYXNzCiAgICAgICAgICAgICRJdGVtRGF0YXtDbGFzc30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJDbGFzcyIgKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhe0NsYXNzfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhUmVmOwoKICAgICAgICAgICAgJUl0ZW1EYXRhID0gJXskSXRlbURhdGFSZWZ9OwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NMaXN0ICAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZnVuY3Rpb25hbGl0eSBsaXN0CiAgICAgICAgbXkgJEZ1bmN0aW9uYWxpdHlSZWYgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+RnVuY3Rpb25hbGl0eUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIGZ1bmN0aW9uYWxpdHkgbGlzdAogICAgICAgIG15ICVGdW5jdGlvbmFsaXR5TGlzdDsKICAgICAgICBmb3IgbXkgJEZ1bmN0aW9uYWxpdHkgKCBAeyRGdW5jdGlvbmFsaXR5UmVmfSApIHsKICAgICAgICAgICAgJEZ1bmN0aW9uYWxpdHlMaXN0eyRGdW5jdGlvbmFsaXR5fSA9ICRGdW5jdGlvbmFsaXR5IHx8ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJUZ1bmN0aW9uYWxpdHlMaXN0ICkgewogICAgICAgICAgICAlRnVuY3Rpb25hbGl0eUxpc3QgPSAoCiAgICAgICAgICAgICAgICAnJyA9PiAnLScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIEZ1bmN0aW9uYWxpdHlPcHRpb25TdHJnCiAgICAgICAgbXkgJEZ1bmN0aW9uYWxpdHlPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Z1bmN0aW9uYWxpdHknLAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJUZ1bmN0aW9uYWxpdHlMaXN0LAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkSXRlbURhdGF7RnVuY3Rpb25hbGl0eX0gfHwgJycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmcKICAgICAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgICAgICBteSAkVmFsaWRPcHRpb25TdHJnICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgRnVuY3Rpb25hbGl0eU9wdGlvblN0cmcgPT4gJEZ1bmN0aW9uYWxpdHlPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgVmFsaWRPcHRpb25TdHJnICAgICAgICAgPT4gJFZhbGlkT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRJdGVtRGF0YXtDbGFzc30gZXEgJ05FVycgKSB7CgogICAgICAgICAgICAjIG91dHB1dCBJdGVtRWRpdENsYXNzQWRkCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdENsYXNzQWRkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NFeGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUVkaXRDbGFzc0V4aXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5HZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRhbG9nIGl0ZW0gc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0l0ZW1TYXZlJyApIHsKICAgICAgICBteSAlSXRlbURhdGE7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KENsYXNzIEl0ZW1JRCBOYW1lIEZ1bmN0aW9uYWxpdHkgVmFsaWRJRCBDb21tZW50KSkgewogICAgICAgICAgICAkSXRlbURhdGF7JFBhcmFtfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGNsYXNzCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgIGlmICEkSXRlbURhdGF7Q2xhc3N9IHx8ICRJdGVtRGF0YXtDbGFzc30gZXEgJ05FVyc7CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgIGlmICggJEl0ZW1EYXRhe0l0ZW1JRH0gZXEgJ05FVycgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpIGlmICEkU3VjY2VzczsKCiAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldyBjbGFzcyBsaXN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1JdGVtTGlzdCZDbGFzcz0kSXRlbURhdGF7Q2xhc3N9IgogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IGNhdGFsb2cgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgICAgICAgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7CiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdDbGFzcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgIGZvciBteSAkQ2xhc3MgKCBAeyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNoYWN0aXZlJyA/ICdzZWFyY2hwYXNzaXZlJyA6ICdzZWFyY2hhY3RpdmUnOwoKICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgY2xhc3MgbGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdDbGFzc0xpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbkdlbmVyYWxDYXRhbG9nLmR0bCx2IDEuNyAyMDA5LzA1LzE4IDA5OjQwOjQ3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSIzMCUiIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbUVkaXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9Ik5FVyI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQWRkIENhdGFsb2cgSXRlbSJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNsYXNzT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikl0ZW1FZGl0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJORVciPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iTkVXIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgQ2F0YWxvZyBDbGFzcyJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kVGV4dHsiQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzIC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikxpc3QifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjYwJSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1JdGVtTGlzdCZDbGFzcz0kTFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJDbGFzcyJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3MgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJMaXN0In06PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI2MCUiPiRRRGF0YXsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPiRUZXh0eyJGdW5jdGlvbmFsaXR5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0iY2VudGVyIj4kVGV4dHsiVmFsaWQifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdJdGVtTGlzdCAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUl0ZW1FZGl0Jkl0ZW1JRD0kUURhdGF7Ikl0ZW1JRCJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJGdW5jdGlvbmFsaXR5In0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7IlZhbGlkIn0ifQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0l0ZW1MaXN0IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0l0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOkl0ZW1FZGl0IC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikl0ZW1TYXZlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSIkUURhdGF7Ikl0ZW1JRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJJdGVtIn0gJFRleHR7IkVkaXQifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0FkZCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjEwMCI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzQWRkIC0tPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzRXhpc3QgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2xhc3MifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkl0ZW1FZGl0Q2xhc3NFeGlzdCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMTAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZ1bmN0aW9uYWxpdHkifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJGdW5jdGlvbmFsaXR5T3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXQgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2cucG0sdiAxLjQ2IDIwMDkvMDcvMjAgMjI6NDg6NTEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQ2ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cgLSBnZW5lcmFsIGNhdGFsb2cgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBnZW5lcmFsIGNhdGFsb2cgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDbGFzc0xpc3QoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSBvZiBhbGwgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzZXMKCiAgICBteSAkQXJyYXlSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzTGlzdCgpOwoKPWN1dAoKc3ViIENsYXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVChnZW5lcmFsX2NhdGFsb2dfY2xhc3MpICcKICAgICAgICAgICAgLiAnRlJPTSBnZW5lcmFsX2NhdGFsb2cgT1JERVIgQlkgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ2xhc3NMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDbGFzc0xpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxAQ2xhc3NMaXN0Owp9Cgo9aXRlbSBDbGFzc1JlbmFtZSgpCgpyZW5hbWUgYSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKCiAgICBteSAkVHJ1ZSA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OlN0YXRlJywKICAgICAgICBDbGFzc05ldyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7Cgo9Y3V0CgpzdWIgQ2xhc3NSZW5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NPbGQgQ2xhc3NOZXcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzT2xkIENsYXNzTmV3KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtDbGFzc05ld30gZXEgJFBhcmFte0NsYXNzT2xkfTsKCiAgICAjIGNoZWNrIGlmIG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc05ld30gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRBbHJlYWR5RXhpc3RzID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEFscmVhZHlFeGlzdHMgPSAxOwogICAgfQoKICAgIGlmICgkQWxyZWFkeUV4aXN0cykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgcmVuYW1lIGNsYXNzICRQYXJhbXtDbGFzc09sZH0hIE5ldyBjbGFzc25hbWUgYWxyZWFkeSBleGlzdHMuIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57Q2xhc3N9LT57ICRQYXJhbXtDbGFzc09sZH0gfTsKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57Q2xhc3N9LT57ICRQYXJhbXtDbGFzc05ld30gfTsKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57SXRlbUlEfTsKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1MaXN0fTsKCiAgICAjIHJlbmFtZSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgZ2VuZXJhbF9jYXRhbG9nIFNFVCBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3NOZXd9LCBcJFBhcmFte0NsYXNzT2xkfSBdLAogICAgKTsKfQoKPWl0ZW0gSXRlbUxpc3QoKQoKcmV0dXJuIGEgbGlzdCBhcyBoYXNoIHJlZmVyZW5jZSBvZiBvbmUgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCgogICAgbXkgJEhhc2hSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ2FjdGl2ZScsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHN0cmluZyBvciBhcnJheSByZWZlcmVuY2UKICAgICAgICBWYWxpZCAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3MhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkUGFyYW17VmFsaWR9ID0gMTsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMICA9ICdTRUxFQ1QgaWQsIG5hbWUgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyAnOwogICAgbXkgQEJJTkQgPSAoIFwkUGFyYW17Q2xhc3N9ICk7CgogICAgIyBhZGQgdmFsaWQgc3RyaW5nIHRvIHNxbCBzdHJpbmcKICAgIGlmICggJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgdmFsaWRfaWQgPSAxICc7CiAgICB9CgogICAgIyBjcmVhdGUgY2FjaGUga2V5CiAgICBteSAkQ2FjaGVLZXkgPSAkUGFyYW17Q2xhc3N9IC4gJyMjIyMnIC4gJFBhcmFte1ZhbGlkfSAuICcjIyMjJzsKCiAgICAjIGFkZCBmdW5jdGlvbmFsaXR5IHRvIHNxbCBzdHJpbmcKICAgIGlmICggJFBhcmFte0Z1bmN0aW9uYWxpdHl9ICkgewoKICAgICAgICAjIGNyZWF0ZSBhcnJheSByZWZlcmVuY2UsIGlmIGZ1bmN0aW9uYWxpdHkgaXMgZ2l2ZSBhcyBzdGluZwogICAgICAgIGlmICggcmVmICRQYXJhbXtGdW5jdGlvbmFsaXR5fSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkUGFyYW17RnVuY3Rpb25hbGl0eX0gPSBbICRQYXJhbXtGdW5jdGlvbmFsaXR5fSBdOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgZnVuY3Rpb25hbGl0eSBzdHJpbmcKICAgICAgICBteSAkRnVuY3Rpb25hbGl0eVN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17RnVuY3Rpb25hbGl0eX0gfTsKCiAgICAgICAgIyBhZGQgZnVuY3Rpb25hbGl0eSBsaXN0IHRvIGNhY2hlIGtleQogICAgICAgICRDYWNoZUtleSAuPSBqb2luIHF7IyMjI30sIG1hcCB7JF99IEB7ICRQYXJhbXtGdW5jdGlvbmFsaXR5fSB9OwoKICAgICAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgICAgIG15IEBCaW5kUGFyYW1zID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte0Z1bmN0aW9uYWxpdHl9IH07CiAgICAgICAgcHVzaCBAQklORCwgQEJpbmRQYXJhbXM7CgogICAgICAgICMgYWRkIGZ1bmN0aW9uYWxpdHkgc3RyaW5nIHRvIHNxbCBzdHJpbmcKICAgICAgICAkU1FMIC49ICJBTkQgZnVuY3Rpb25hbGl0eSBJTiAoJEZ1bmN0aW9uYWxpdHlTdHJpbmcpIjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57SXRlbUxpc3R9LT57JENhY2hlS2V5fQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57SXRlbUxpc3R9LT57JENhY2hlS2V5fTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGNoZWNrIGl0ZW0KICAgIGlmICggISVEYXRhICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2xhc3Mgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1MaXN0fS0+eyRDYWNoZUtleX0gPSBcJURhdGE7CgogICAgcmV0dXJuIFwlRGF0YTsKfQoKPWl0ZW0gRnVuY3Rpb25hbGl0eUxpc3QoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSBvZiBhbGwgZnVuY3Rpb25hbGl0aWVzIG9mIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCgogICAgbXkgJEFycmF5UmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5GdW5jdGlvbmFsaXR5TGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICApOwoKPWN1dAoKc3ViIEZ1bmN0aW9uYWxpdHlMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1QoZnVuY3Rpb25hbGl0eSkgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IE9SREVSIEJZIGZ1bmN0aW9uYWxpdHknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBGdW5jdGlvbmFsaXR5TGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJvd1swXSB8fD0gJyc7CiAgICAgICAgcHVzaCBARnVuY3Rpb25hbGl0eUxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxARnVuY3Rpb25hbGl0eUxpc3Q7Cn0KCj1pdGVtIEl0ZW1HZXQoKQoKZ2V0IGEgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KClJldHVybgogICAgJEl0ZW1EYXRhe0l0ZW1JRH0KICAgICRJdGVtRGF0YXtDbGFzc30KICAgICRJdGVtRGF0YXtOYW1lfQogICAgJEl0ZW1EYXRhe0Z1bmN0aW9uYWxpdHl9CiAgICAkSXRlbURhdGF7VmFsaWRJRH0KICAgICRJdGVtRGF0YXtDb21tZW50fQogICAgJEl0ZW1EYXRhe0NyZWF0ZVRpbWV9CiAgICAkSXRlbURhdGF7Q3JlYXRlQnl9CiAgICAkSXRlbURhdGF7Q2hhbmdlVGltZX0KICAgICRJdGVtRGF0YXtDaGFuZ2VCeX0KCiAgICBteSAkSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEICA9PiAzLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgTmFtZSAgPT4gJ0l0ZW0gTmFtZScsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW1JRH0gJiYgKCAhJFBhcmFte0NsYXNzfSB8fCAhJFBhcmFte05hbWV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW1JRCBPUiBDbGFzcyBhbmQgTmFtZSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIGdlbmVyYWxfY2F0YWxvZ19jbGFzcywgbmFtZSwgZnVuY3Rpb25hbGl0eSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSAnOwogICAgbXkgQEJJTkQ7CgogICAgIyBhZGQgb3B0aW9ucyB0byBzcWwgc3RyaW5nCiAgICBpZiAoICRQYXJhbXtDbGFzc30gJiYgJFBhcmFte05hbWV9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57Q2xhc3N9LT57ICRQYXJhbXtDbGFzc30gfS0+eyAkUGFyYW17TmFtZX0gfQogICAgICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57Q2xhc3N9LT57ICRQYXJhbXtDbGFzc30gfS0+eyAkUGFyYW17TmFtZX0gfTsKCiAgICAgICAgIyBhZGQgY2xhc3MgYW5kIG5hbWUgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2dlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JzsKICAgICAgICBwdXNoIEBCSU5ELCAoIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9ICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntJdGVtR2V0fS0+e0l0ZW1JRH0tPnsgJFBhcmFte0l0ZW1JRH0gfQogICAgICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57SXRlbUlEfS0+eyAkUGFyYW17SXRlbUlEfSB9OwoKICAgICAgICAjIGFkZCBpdGVtIGlkIHRvIHNxbCBzdHJpbmcKICAgICAgICAkU1FMIC49ICdpZCA9ID8nOwogICAgICAgIHB1c2ggQEJJTkQsIFwkUGFyYW17SXRlbUlEfTsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJJTkQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlSXRlbURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRJdGVtRGF0YXtJdGVtSUR9ICAgICAgICA9ICRSb3dbMF07CiAgICAgICAgJEl0ZW1EYXRhe0NsYXNzfSAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkSXRlbURhdGF7TmFtZX0gICAgICAgICAgPSAkUm93WzJdOwogICAgICAgICRJdGVtRGF0YXtGdW5jdGlvbmFsaXR5fSA9ICRSb3dbM10gfHwgJyc7CiAgICAgICAgJEl0ZW1EYXRhe1ZhbGlkSUR9ICAgICAgID0gJFJvd1s0XTsKICAgICAgICAkSXRlbURhdGF7Q29tbWVudH0gICAgICAgPSAkUm93WzVdIHx8ICcnOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVUaW1lfSAgICA9ICRSb3dbNl07CiAgICAgICAgJEl0ZW1EYXRhe0NyZWF0ZUJ5fSAgICAgID0gJFJvd1s3XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlVGltZX0gICAgPSAkUm93WzhdOwogICAgICAgICRJdGVtRGF0YXtDaGFuZ2VCeX0gICAgICA9ICRSb3dbOV07CiAgICB9CgogICAgIyBjaGVjayBpdGVtCiAgICBpZiAoICEkSXRlbURhdGF7SXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0l0ZW0gbm90IGZvdW5kIGluIGRhdGFiYXNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57Q2xhc3N9LT57ICRJdGVtRGF0YXtDbGFzc30gfS0+eyAkSXRlbURhdGF7TmFtZX0gfSA9IFwlSXRlbURhdGE7CiAgICAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57SXRlbUlEfS0+eyAkSXRlbURhdGF7SXRlbUlEfSB9ID0gXCVJdGVtRGF0YTsKCiAgICByZXR1cm4gXCVJdGVtRGF0YTsKfQoKPWl0ZW0gSXRlbUFkZCgpCgphZGQgYSBuZXcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KCiAgICBteSAkSXRlbUlEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnRnVuYzMnLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICA9PiAnQ29tbWVudCcsICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEZ1bmN0aW9uYWxpdHkgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gJyc7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MgRnVuY3Rpb25hbGl0eSkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyBpdGVtIHdpdGggc2FtZSBuYW1lCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROb0FkZDsKICAgIHdoaWxlICggJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTm9BZGQgPSAxOwogICAgfQoKICAgICMgYWJvcnQgaW5zZXJ0IG9mIG5ldyBpdGVtLCBpZiBpdGVtIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkTm9BZGQpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1MaXN0fTsKCiAgICAjIGluc2VydCBuZXcgaXRlbQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICcoZ2VuZXJhbF9jYXRhbG9nX2NsYXNzLCBuYW1lLCBmdW5jdGlvbmFsaXR5LCB2YWxpZF9pZCwgY29tbWVudHMsICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICcKICAgICAgICAgICAgLiAnKD8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NsYXNzfSwgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte0Z1bmN0aW9uYWxpdHl9LCBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbW1lbnR9LCAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IGl0ZW0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nICcKICAgICAgICAgICAgLiAnV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzfSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJEl0ZW1JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEl0ZW1JRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRJdGVtSUQ7Cn0KCj1pdGVtIEl0ZW1VcGRhdGUoKQoKdXBkYXRlIGEgZXhpc3RpbmcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KCiAgICBteSAkVHJ1ZSA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbVVwZGF0ZSgKICAgICAgICBJdGVtSUQgICAgICAgID0+IDEyMywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdJdGVtIE5hbWUnLAogICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ0Z1bmMzJywgICAgICAjIChvcHRpb25hbCkKICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEZ1bmN0aW9uYWxpdHkgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gJyc7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MgRnVuY3Rpb25hbGl0eSkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBvZiBpdGVtCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGdlbmVyYWxfY2F0YWxvZ19jbGFzcywgZnVuY3Rpb25hbGl0eSBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ2xhc3M7CiAgICBteSAkT2xkRnVuY3Rpb25hbGl0eTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENsYXNzID0gJFJvd1swXTsKICAgICAgICAkT2xkRnVuY3Rpb25hbGl0eSA9ICRSb3dbMV0gfHwgJyc7CiAgICB9CgogICAgaWYgKCAhJENsYXNzICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIG5vdCBmb3VuZCBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJENsYXNzLCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVXBkYXRlID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17SXRlbUlEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkVXBkYXRlID0gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFVwZGF0ZSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IHVwZGF0ZSBpdGVtISBHZW5lcmFsIGNhdGFsb2cgaXRlbSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjb3VudCB0aGUgZnVuY3Rpb25hbGl0eQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgQ09VTlQoZnVuY3Rpb25hbGl0eSkgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBmdW5jdGlvbmFsaXR5ID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkQ2xhc3MsIFwkT2xkRnVuY3Rpb25hbGl0eSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJExhc3RGdW5jdGlvbmFsaXR5ID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID4gMSB8fCAkUGFyYW17RnVuY3Rpb25hbGl0eX0gZXEgJE9sZEZ1bmN0aW9uYWxpdHkgKSB7CiAgICAgICAgICAgICRMYXN0RnVuY3Rpb25hbGl0eSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgICMgYWJvcnQgdXBkYXRlLCBpZiBmdW5jdGlvbmFsaXR5IGlzIHRoZSBsYXN0IG9uZQogICAgaWYgKCRMYXN0RnVuY3Rpb25hbGl0eSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIFRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgaXRlbSBpcyB0aGUgbGFzdCBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntDbGFzc30tPnskQ2xhc3N9LT57ICRQYXJhbXtOYW1lfSB9OwogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntJdGVtSUR9LT57ICRQYXJhbXtJdGVtSUR9IH07CiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntJdGVtTGlzdH07CgogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUICcKICAgICAgICAgICAgLiAnbmFtZSA9ID8sIGZ1bmN0aW9uYWxpdHkgPSA/LCcKICAgICAgICAgICAgLiAndmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sICcKICAgICAgICAgICAgLiAnY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgIFwkUGFyYW17RnVuY3Rpb25hbGl0eX0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgIFwkUGFyYW17SXRlbUlEfSwKICAgICAgICBdLAogICAgKTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40NiAkICREYXRlOiAyMDA5LzA3LzIwIDIyOjQ4OjUxICQKCj1jdXQK
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnQgLSBnZW5lcmFsIGNhdGFsb2cgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnQsdiAxLjE4IDIwMDkvMDUvMTggMDk6NDA6NDcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMiApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnR2VuZXJhbENhdGFsb2cnIC4gJENvdW50ZXIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVW5pdFRlc3QtR2VuZXJhbENhdGFsb2ctJyAuICRDb3VudGVyIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1HZW5lcmFsQ2F0YWxvZy0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCiAgICApOwp9CgojIGNyZWF0ZSBuZWVkZWQgcmFuZG9tIGNsYXNzZXMKbXkgQENsYXNzUmFuZDsKCmZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICBwdXNoIEBDbGFzc1JhbmQsIGludCByYW5kIDFfMDAwXzAwMDsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW0xJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgPT4gJ1Rlc3RJdGVtMicsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW00JywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgb25lIHRlc3QgYmVmb3JlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW00JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKEZ1bmMgJycgaXMgdGhlIGxhc3QgaW4gdGhpcyBjbGFzcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0SXRlbTRVUERBVEUxJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW01JywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdDEnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW01JywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdDEnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdUZXN0SXRlbTVVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ1Rlc3QxJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoRnVuYyAndGVzdDEnIGlzIHRoZSBsYXN0IGluIHRoaXMgY2xhc3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW01JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoRnVuYyAndGVzdDEnIGlzIHRoZSBsYXN0IGluIHRoaXMgY2xhc3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW01JywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdDInLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBhcmUgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMicsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ1Rlc3QxJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTInLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdUZXN0MScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTMnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdUZXN0MScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMycsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ1Rlc3QxJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiIFx0IFxuIFxyIFVuaXQgVGVzdCA6OiBUZXN0IENsYXNzIFx0IFxuIFxyICIgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICIgXHQgXG4gXHIgVGVzdCBJdGVtIFx0IFxuIFxyICIsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gIiBcdCBcbiBcciBUZXN0IEZ1bmN0aW9uYWxpdHkgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdCBJdGVtJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdEZ1bmN0aW9uYWxpdHknLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJ1Rlc3QgQ29tbWVudCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gIiBcdCBcbiBcciBUZXN0IEl0ZW0gVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICIgXHQgXG4gXHIgVGVzdCBGdW5jIHRpb25hIGxpdHkgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0IEl0ZW0gVVBEQVRFMScsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ1Rlc3RGdW5jdGlvbmFsaXR5JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnVGVzdCBDb21tZW50IFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc8KpJyAuICRDbGFzc1JhbmRbMV0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJyDPkiDPoSBUZXN0IEl0ZW0gxqkgz54gJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnINGgINGkIFRlc3RGdW5jdGlvbmFsaXR5IM+gIM6pICcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnIM+gINCvIFRlc3QgQ29tbWVudCDRrCDRoCAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzwqknIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnz5Igz6EgVGVzdCBJdGVtIMapIM+eJywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAn0aDRpFRlc3RGdW5jdGlvbmFsaXR5z6DOqScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnz6Ag0K8gVGVzdCBDb21tZW50INGsINGgJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdCBJdGVtIMapIMmkIFVQREFURTEnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICcg0aAg0aQgVGVzdEZ1bmN0aW9uYWxpdHkgz6AgzqkgJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnIFRlc3QgQ29tbWVudCDRmSDRkiBVUERBVEUxICcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdUZXN0IEl0ZW0gxqkgyaQgVVBEQVRFMScsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ9Gg0aRUZXN0RnVuY3Rpb25hbGl0ec+gzqknLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICdUZXN0IENvbW1lbnQg0Zkg0ZIgVVBEQVRFMScsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChhIHNlY29uZCBpdGVtIHdpdGggRnVuY3Rpb25hbGl0eSAndGVzdDEnKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdDEnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnVGVzdDEnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHNldCBmdW5jdGlvbmFsaXR5IHRvICcnKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICcnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICcnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzW3Rlc3RdJSpcXCcgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICcgW3Rlc3RdJSpcXCBUZXN0IEl0ZW0gW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICcgW3Rlc3RdJSpcXCBUZXN0RnVuY3Rpb25hbGl0eSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnW3Rlc3RdJSpcXCBUZXN0IEl0ZW0gW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ1t0ZXN0XSUqXFxUZXN0RnVuY3Rpb25hbGl0eVt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5IChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBJdGVtIFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICcgW3Rlc3RdJSpcXCBUZXN0RnVuY3Rpb25hbGl0eSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ1t0ZXN0XSUqXFxUZXN0RnVuY3Rpb25hbGl0eVt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICdbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15ICRMYXN0QWRkZWRJdGVtSUQ7Cm15ICVBZGRlZEl0ZW1Db3VudGVyOwoKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewoKICAgIGlmICggJEl0ZW0tPntBZGR9ICkgewoKICAgICAgICAjIGFkZCBuZXcgaXRlbQogICAgICAgIG15ICRJdGVtSUQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICAgICAgJXsgJEl0ZW0tPntBZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBpdGVtIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e0FkZEdldH0gKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRJdGVtSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtQWRkKCkgLSBJdGVtS2V5OiAkSXRlbUlEIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXRlbUlEKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgbGFzdCBpdGVtIGlkIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAkTGFzdEFkZGVkSXRlbUlEID0gJEl0ZW1JRDsKCiAgICAgICAgICAgICAgICAjIGluY3JlbWVudCB0aGUgYWRkZWQgaXRlbSBjb3VudGVyCiAgICAgICAgICAgICAgICAkQWRkZWRJdGVtQ291bnRlcnsgJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9IH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJEl0ZW1JRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1BZGQoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgbXkgJEl0ZW1HZXQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e0FkZH0tPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0KICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldC0+eyRJdGVtQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRJdGVtQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1HZXQoKSAtICRJdGVtQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgbGFzdCBpdGVtIGlkIHZhcmFpYmxlCiAgICAgICAgaWYgKCAhJExhc3RBZGRlZEl0ZW1JRCApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5PIExBU1QgSVRFTSBJRCBHSVZFTiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgaXRlbQogICAgICAgIG15ICRVcGRhdGVTdWNlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICAgICAgJXsgJEl0ZW0tPntVcGRhdGV9IH0sCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaXRlbSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1VcGRhdGUoKSAtIEl0ZW1LZXk6ICRMYXN0QWRkZWRJdGVtSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1VcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJEl0ZW1HZXQyID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldDItPnskSXRlbUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPnskSXRlbUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSAkSXRlbUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zIGZvciBsYXRlciB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBuZWVkZWQgYXJyYXlzCm15ICVFeGlzdGluZ0NsYXNzZXNUbXA7CklURU06CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9OwogICAgJEV4aXN0aW5nQ2xhc3Nlc1RtcHsgJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9IH0gPSAxOwp9Cm15IEBFeGlzdGluZ0NsYXNzZXMgPSBzb3J0IGtleXMgJUV4aXN0aW5nQ2xhc3Nlc1RtcDsKCm15ICVFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcDsKSVRFTToKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewogICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57RnVuY3Rpb25hbGl0eX0gfHw9ICcnOwogICAgJEV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1weyAkSXRlbS0+e1VwZGF0ZUdldH0tPntGdW5jdGlvbmFsaXR5fSB9ID0gMTsKfQpteSBARXhpc3RpbmdGdW5jdGlvbmFsaXRpZXMgPSBzb3J0IGtleXMgJUV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1wOwoKbXkgQE5vbkV4aXN0aW5nQ2xhc3NlcyA9ICggJ1VuaXRUZXN0OjpOb0V4aXN0aW5nQ2xhc3MxJywgJ1VuaXRUZXN0OjpOb0V4aXN0aW5nQ2xhc3MyJyApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzTGlzdCB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJENsYXNzTGlzdDEgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJENsYXNzQ291bnQgPSAwOwogICAgaWYgKCAkQ2xhc3NMaXN0MSAmJiByZWYgJENsYXNzTGlzdDEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAkQ2xhc3NDb3VudCA9IGdyZXAgeyAkXyBlcSAkQ2xhc3MgfSBAeyRDbGFzc0xpc3QxfTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJENsYXNzQ291bnQsCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc0xpc3QoKSAtICRDbGFzcyBsaXN0ZWQiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBJdGVtTGlzdCB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRDbGFzcyAoQE5vbkV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRJdGVtTGlzdCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gJENsYXNzIG5vdCBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBJdGVtTGlzdCB0ZXN0IDIKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJExpc3RDb3VudCA9ICdOVUxMJzsKICAgIGlmICggZGVmaW5lZCAkSXRlbUxpc3QgJiYgcmVmICRJdGVtTGlzdCBlcSAnSEFTSCcgKSB7CiAgICAgICAgJExpc3RDb3VudCA9IGtleXMgJXskSXRlbUxpc3R9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkTGlzdENvdW50LAogICAgICAgICRBZGRlZEl0ZW1Db3VudGVyeyRDbGFzc30sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtICRDbGFzcyBjb3JyZWN0IG51bWJlciBvZiBpdGVtcyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEZ1bmN0aW9uYWxpdHlMaXN0IHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAlRnVuY3Rpb25hbGl0eUxpc3QxOwptYXAgeyAkRnVuY3Rpb25hbGl0eUxpc3QxeyRffSA9IDEgfSBARXhpc3RpbmdGdW5jdGlvbmFsaXRpZXM7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEZ1bmN0aW9uYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkZ1bmN0aW9uYWxpdHlMaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEZ1bmN0aW9uYWxpdHlMaXN0ICYmIHJlZiAkRnVuY3Rpb25hbGl0eUxpc3QgZXEgJ0FSUkFZJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBGdW5jdGlvbmFsaXR5TGlzdCgpIC0gcmV0dXJuIGEgYXJyYXkgcmVmZXJlbmNlIiwKICAgICk7CgogICAgZm9yIG15ICRGdW5jdGlvbmFsaXR5ICggQHskRnVuY3Rpb25hbGl0eUxpc3R9ICkgewogICAgICAgIGRlbGV0ZSAkRnVuY3Rpb25hbGl0eUxpc3QxeyRGdW5jdGlvbmFsaXR5fTsKICAgIH0KCiAgICAkVGVzdENvdW50Kys7Cn0KCiRTZWxmLT5UcnVlKAogICAgIWtleXMgJUZ1bmN0aW9uYWxpdHlMaXN0MSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZ1bmN0aW9uYWxpdHlMaXN0KCkiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMSAoY2hlY2sgbm9ybWFsIHJlbmFtZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKQ0xBU1M6CmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkT2xkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcywKICAgICAgICBDbGFzc05ldyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpDTEFTUzoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRPbGRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIENsYXNzTmV3ID0+ICcgJyAuICRDbGFzcyAuICJSRSBOQSBNRSAyIFxuIFxyIFx0ICIsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGlkZW50aWNhbCBuYW1lIHRlc3QpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgQ2xhc3NOZXcgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gb2xkbmFtZSBhbmQgbmV3bmFtZSBpZGVudGljYWwiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDMgKG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFsyXSwKICAgIE5hbWUgICAgICAgICAgPT4gJ0R1bW15JywKICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIENsYXNzTmV3ID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMl0sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCjE7Cg==