Calendar 1.8.3 OTRS AG http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Fixed bug# 3052 - missing default values on upgrading and fixed bug# 3049 - small typo in intro. Moved to/fixed Type/Key attribute for new cache backend. Upgrade to OTRS 2.3 framework. A web calendar. Ein Web Kalender. 2.3.x The Calendar Application will be found at the navigation bar to handle internal events. Die Kalender Applikation ist in der Navigationsleiste zu finden. Mit ihr können interne Termine verwaltet werden. 2008-07-02 11:41:11 opms.otrs.com PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IENhbGVuZGFyLnhtbCx2IDEuOCAyMDA3LzAxLzE1IDIyOjE2OjU3IG1oIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRDYWxlbmRhciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkFsbCBwYXJhbWV0ZXJzIGZvciB0aGUgQ2FsZW5kYXIgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFsbGUgUGFyYW1ldGVyIGRlcyBDYWxlbmRhci1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5DYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkEgd2ViIGNhbGVuZGFyPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNhbGVuZGFyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPkNhbGVuZGFyPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkEgd2ViIGNhbGVuZGFyPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5DYWxlbmRhcjwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5NZW51PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmNhbGVuZGFyLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50Q2FsZW5kYXI8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+YzwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjgwMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRvZGF5PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5Ub2RheTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+dG9kYXkucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRDYWxlbmRhcjwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bzwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjEwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+NSBEYXkgV2VlayBWaWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT41IERheTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+NWRheXMucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRDYWxlbmRhciZhbXA7Vmlldz1XZWVrNTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+NTwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjExMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+NyBEYXkgV2VlayBWaWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT43IERheTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+N2RheXMucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRDYWxlbmRhciZhbXA7Vmlldz1XZWVrNzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+NzwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjEyMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+MyBNb250aCBWaWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT4zIE1vbnRoPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5tb250aC5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudENhbGVuZGFyJmFtcDtWaWV3PU1vbnRoPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q2FsZW5kYXI8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT4zPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTMwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok5vdGlmeU1vZHVsZSMjIzgwLVNob3dDYWxlbmRhckV2ZW50cyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgbW9kdWxlIGRpc3BsYXlzIGNhbGVuZGFyIGV2ZW50cyBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdlcmRlbiBLYWxlbmRlci1FaW50cuRnZSBpbSBBZ2VudC1JbnRlcmZhY2UgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkNhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVOb3RpZnk8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6Tm90aWZpY2F0aW9uQ2FsZW5kYXI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+ IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ2FsZW5kYXJFdmVudC5wbSAtIG1hbmFnZSBhbGwgY2FsZW5kYXIgZXZlbnRzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDYWxlbmRhckV2ZW50LnBtLHYgMS4xMyAyMDA4LzAzLzA0IDExOjE2OjI0IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhckV2ZW50OwoKdXNlIHN0cmljdDsKdXNlIERhdGU6OlBjYWxjIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xMyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhckV2ZW50IC0gY2FsZW5kYXIgZXZlbnQgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBjYWxlbmRhciBldmVudCBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXJFdmVudDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJFRpbWVPYmpldCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCA9PiAkTWFpbk9iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkQ2FsZW5kYXJFdmVudE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhckV2ZW50LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCA9PiAkVGltZU9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBUaW1lT2JqZWN0IFVzZXJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CiAgICAkU2VsZi0+e1NlbmRtYWlsT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBFdmVudEFkZCgpCgpjcmVhdGVzIGEgbmV3IGV2ZW50CgogICAgbXkgJEV2ZW50SUQgPSAkQ2FsZW5kYXJFdmVudE9iamVjdC0+RXZlbnRBZGQoCiAgICAgICAgVGl0bGUgPT4gJ1NvbWUgVGl0bGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdTb21lIERlc2NyaXB0aW9uJywKICAgICAgICBMb2NhdGlvbiA9PiAnU29tZSBMb2NhdGlvbicsCiAgICAgICAgU3RhcnRUaW1lID0+ICcxOTc3LTEwLTI3IDIwOjE1OjAwJywKICAgICAgICBFbmRUaW1lID0+ICcxOTc3LTEwLTI3IDIxOjAwOjAwJywKICAgICAgICBTZXF1ZW5jZUVuZFRpbWUgPT4gJ05vcm1hbCcsICNZZWFybHkgV2Vla2x5IE1vbnRobHkKICAgICAgICBTdGF0ZSA9PiAnTWVldGluZycsCiAgICAgICAgUGFydGljaXBhbnRJRHMgPT4gWzEyMywgMSwgMiwgM10sCiAgICAgICAgT3JnYW5pemVySUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEV2ZW50QWRkIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVEQlBhcmFtID0gKCk7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVGl0bGUgTG9jYXRpb24gU3RhcnRUaW1lIEVuZFRpbWUgU2VxdWVuY2VFbmRUaW1lIFN0YXRlIFBhcnRpY2lwYW50SURzIE9yZ2FuaXplcklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGNvbnRlbnQKICAgIGlmICghZGVmaW5lZCgkUGFyYW17RGVzY3JpcHRpb259KSkgewogICAgICAgICRQYXJhbXtEZXNjcmlwdGlvbn0gPSAnLSc7CiAgICB9CiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbiBTdGFydFRpbWUgRW5kVGltZSBTZXF1ZW5jZUVuZFRpbWUgU2VxdWVuY2VUeXBlIFJlbWluZGVyIFN0YXRlKSkgewogICAgICAgICREQlBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KE9yZ2FuaXplcklEIFVzZXJJRCkpIHsKICAgICAgICAkREJQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsCiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIGNhbGVuZGFyX2V2ZW50ICIuCiAgICAgICAgIiAodGl0bGUsIGNvbnRlbnQsIGxvY2F0aW9uLCBzdGFydF90aW1lLCBlbmRfdGltZSwgc2VxdWVuY2VfZW5kX3RpbWUsIHNlcXVlbmNlX3R5cGUsICIuCiAgICAgICAgIiByZW1pbmRlciwgb3duZXJfaWQsIGV2ZW50X3N0YXR1cywgIi4KICAgICAgICAiIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpICIuCiAgICAgICAgIiBWQUxVRVMgIi4KICAgICAgICAiICgnJERCUGFyYW17VGl0bGV9JywgJyREQlBhcmFte0Rlc2NyaXB0aW9ufScsICckREJQYXJhbXtMb2NhdGlvbn0nLCAnJERCUGFyYW17U3RhcnRUaW1lfScsICIuCiAgICAgICAgIiAnJERCUGFyYW17RW5kVGltZX0nLCAnJERCUGFyYW17U2VxdWVuY2VFbmRUaW1lfScsICckREJQYXJhbXtTZXF1ZW5jZVR5cGV9JywgIi4KICAgICAgICAiICckREJQYXJhbXtSZW1pbmRlcn0nLCAkREJQYXJhbXtPcmdhbml6ZXJJRH0sICckREJQYXJhbXtTdGF0ZX0nLCAiLgogICAgICAgICIgY3VycmVudF90aW1lc3RhbXAsICREQlBhcmFte1VzZXJJRH0sIGN1cnJlbnRfdGltZXN0YW1wLCAkREJQYXJhbXtVc2VySUR9KSI7CiAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgIG15ICRFdmVudElEOwogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gY2FsZW5kYXJfZXZlbnQgV0hFUkUgIi4KICAgICAgICAgICAgIiBzdGFydF90aW1lID0gJyREQlBhcmFte1N0YXJ0VGltZX0nIEFORCBlbmRfdGltZSA9ICckREJQYXJhbXtFbmRUaW1lfScgQU5EICIuCiAgICAgICAgICAgICIgb3duZXJfaWQgPSAkREJQYXJhbXtPcmdhbml6ZXJJRH0gQU5EIHRpdGxlID0gJyREQlBhcmFte1RpdGxlfSciOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJEV2ZW50SUQgPSAkUm93WzBdOwogICAgICAgIH0KICAgICAgICAjIHVwZGF0ZWQgZGIKICAgICAgICBmb3JlYWNoIG15ICRQYXJ0aWNpcGFudElEIChAeyRQYXJhbXtQYXJ0aWNpcGFudElEc319KSB7CiAgICAgICAgICAgICRQYXJ0aWNpcGFudElEID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJ0aWNpcGFudElEKTsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBjYWxlbmRhcl9ldmVudF9pbnZvbHZlZCAiLgogICAgICAgICAgICAgICAgICAgICIgKGV2ZW50X2lkLCB1c2VyX2lkKSBWQUxVRVMgKCRFdmVudElELCAkUGFydGljaXBhbnRJRCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIG5vdGlmeQogICAgICAgIG15ICRpQ2FsZW5kYXIgPSAkU2VsZi0+X2lDYWxlbmRhck1lc3NhZ2UoCiAgICAgICAgICAgIEV2ZW50SUQgPT4gJEV2ZW50SUQsCiAgICAgICAgICAgIE1ldGhvZCA9PiAnUkVRVUVTVCcsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIG15ICROb3RpZnkgPSAkU2VsZi0+X0VtYWlsTWVzc2FnZSgKICAgICAgICAgICAgRXZlbnRJRCA9PiAkRXZlbnRJRCwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgZm9yZWFjaCBteSAkUGFydGljaXBhbnRJRCAoQHskUGFyYW17UGFydGljaXBhbnRJRHN9fSkgewogICAgICAgICAgICAjIG93bmVyIGxvb2t1cAogICAgICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJ0aWNpcGFudElELAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzZW5kIG5vdGlmaWNhdGlvbgogICAgICAgICAgICBpZiAoJFVzZXJ7VXNlckVtYWlsfSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntTZW5kbWFpbE9iamVjdH0tPlNlbmQoCiAgICAgICAgICAgICAgICAgICAgRnJvbSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyTmFtZScpLgogICAgICAgICAgICAgICAgICAgICAgICAnIDwnLiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJFbWFpbCcpLic+JywKICAgICAgICAgICAgICAgICAgICBUbyA9PiAkVXNlcntVc2VyRW1haWx9LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gIltFdmVudC9OZXddICRQYXJhbXtUaXRsZX0iLAogICAgICAgICAgICAgICAgICAgICAgICAnUmVwbHktVG8nID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJFbWFpbCcpLAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgfHwgJ2lzby04ODU5LTEnLAogICAgICAgICAgICAgICAgICAgIEJvZHkgPT4gJE5vdGlmeSwKICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4gIiRQYXJhbXtUaXRsZX0uaWNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJGlDYWxlbmRhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJ0ZXh0L2NhbGVuZGFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nID0+ICdwbGFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJEV2ZW50SUQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCj1pdGVtIEV2ZW50VXBkYXRlKCkKCnVwZGF0ZXMgYW4gZXZlbnQKCiAgICAkQ2FsZW5kYXJFdmVudE9iamVjdC0+RXZlbnRVcGRhdGUoCiAgICAgICAgRXZlbnRJRCA9PiAxMjMsCiAgICAgICAgVGl0bGUgPT4gJ1NvbWUgVGl0bGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdTb21lIERlc2NyaXB0aW9uJywKICAgICAgICBMb2NhdGlvbiA9PiAnU29tZSBMb2NhdGlvbicsCiAgICAgICAgU3RhcnRUaW1lID0+ICcxOTc3LTEwLTI3IDIwOjE1OjAwJywKICAgICAgICBFbmRUaW1lID0+ICcxOTc3LTEwLTI3IDIxOjAwOjAwJywKICAgICAgICBTZXF1ZW5jZUVuZFRpbWUgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgPT4gJ01lZXRpbmcnLAogICAgICAgIFBhcnRpY2lwYW50SURzID0+IFsxMjMsIDEsIDIsIDNdCiAgICAgICAgT3JnYW5pemVySUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEV2ZW50VXBkYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVEQlBhcmFtID0gKCk7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoRXZlbnRJRCBUaXRsZSBMb2NhdGlvbiBTdGFydFRpbWUgRW5kVGltZSBTZXF1ZW5jZUVuZFRpbWUgU2VxdWVuY2VUeXBlIFN0YXRlIE9yZ2FuaXplcklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGNvbnRlbnQKICAgIGlmICghZGVmaW5lZCgkUGFyYW17RGVzY3JpcHRpb259KSkgewogICAgICAgICRQYXJhbXtEZXNjcmlwdGlvbn0gPSAnJzsKICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFRpdGxlIERlc2NyaXB0aW9uIExvY2F0aW9uIFN0YXJ0VGltZSBFbmRUaW1lIFNlcXVlbmNlRW5kVGltZSBTZXF1ZW5jZVR5cGUgUmVtaW5kZXIgU3RhdGUpKSB7CiAgICAgICAgJERCUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoRXZlbnRJRCBPcmdhbml6ZXJJRCBVc2VySUQpKSB7CiAgICAgICAgJERCUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbAogICAgbXkgJFNRTCA9ICJVUERBVEUgY2FsZW5kYXJfZXZlbnQgU0VUICIuCiAgICAgICAgIiB0aXRsZSA9ICckREJQYXJhbXtUaXRsZX0nLCAiLgogICAgICAgICIgY29udGVudCA9ICckREJQYXJhbXtEZXNjcmlwdGlvbn0nLCAiLgogICAgICAgICIgbG9jYXRpb24gPSAnJERCUGFyYW17TG9jYXRpb259JywgIi4KICAgICAgICAiIHN0YXJ0X3RpbWUgPSAnJERCUGFyYW17U3RhcnRUaW1lfScsICIuCiAgICAgICAgIiBlbmRfdGltZSA9ICckREJQYXJhbXtFbmRUaW1lfScsICIuCiAgICAgICAgIiBzZXF1ZW5jZV90eXBlID0gJyREQlBhcmFte1NlcXVlbmNlVHlwZX0nLCAiLgogICAgICAgICIgc2VxdWVuY2VfZW5kX3RpbWUgPSAnJERCUGFyYW17U2VxdWVuY2VFbmRUaW1lfScsICIuCiAgICAgICAgIiByZW1pbmRlciA9ICckREJQYXJhbXtSZW1pbmRlcn0nLCAiLgogICAgICAgICIgb3duZXJfaWQgPSAkREJQYXJhbXtPcmdhbml6ZXJJRH0sICIuCiAgICAgICAgIiBldmVudF9zdGF0dXMgPSAnJERCUGFyYW17U3RhdGV9JywgIi4KICAgICAgICAiIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsICIuCiAgICAgICAgIiBjaGFuZ2VfYnkgPSAkREJQYXJhbXtVc2VySUR9ICIuCiAgICAgICAgIiBXSEVSRSAiLgogICAgICAgICIgaWQgPSAkREJQYXJhbXtFdmVudElEfSI7CiAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBjYWxlbmRhcl9ldmVudF9pbnZvbHZlZCBXSEVSRSBldmVudF9pZCA9ICREQlBhcmFte0V2ZW50SUR9IiwKICAgICAgICApOwogICAgICAgICMgdXBkYXRlZCBkYgogICAgICAgIGZvcmVhY2ggbXkgJFBhcnRpY2lwYW50SUQgKEB7JFBhcmFte1BhcnRpY2lwYW50SURzfX0pIHsKICAgICAgICAgICAgJFBhcnRpY2lwYW50SUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcnRpY2lwYW50SUQpOwogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGNhbGVuZGFyX2V2ZW50X2ludm9sdmVkICIuCiAgICAgICAgICAgICAgICAgICAgIiAoZXZlbnRfaWQsIHVzZXJfaWQpIFZBTFVFUyAoJERCUGFyYW17RXZlbnRJRH0sICRQYXJ0aWNpcGFudElEKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgbm90aWZ5CiAgICAgICAgbXkgJGlDYWxlbmRhciA9ICRTZWxmLT5faUNhbGVuZGFyTWVzc2FnZSgKICAgICAgICAgICAgRXZlbnRJRCA9PiAkUGFyYW17RXZlbnRJRH0sCiAgICAgICAgICAgIE1ldGhvZCA9PiAnUkVRVUVTVCcsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIG15ICROb3RpZnkgPSAkU2VsZi0+X0VtYWlsTWVzc2FnZSgKICAgICAgICAgICAgRXZlbnRJRCA9PiAkUGFyYW17RXZlbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGZvcmVhY2ggbXkgJFBhcnRpY2lwYW50SURzIChAeyRQYXJhbXtQYXJ0aWNpcGFudElEc319KSB7CiAgICAgICAgICAgICMgb3duZXIgbG9va3VwCiAgICAgICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcnRpY2lwYW50SURzLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzZW5kIG5vdGlmaWNhdGlvbgogICAgICAgICAgICBpZiAoJFVzZXJ7VXNlckVtYWlsfSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntTZW5kbWFpbE9iamVjdH0tPlNlbmQoCiAgICAgICAgICAgICAgICAgICAgRnJvbSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyTmFtZScpLgogICAgICAgICAgICAgICAgICAgICAgICAnIDwnLiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJFbWFpbCcpLic+JywKICAgICAgICAgICAgICAgICAgICBUbyA9PiAkVXNlcntVc2VyRW1haWx9LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gIltFdmVudC9VcGRhdGVdICRQYXJhbXtUaXRsZX0iLAogICAgICAgICAgICAgICAgICAgICAgICAnUmVwbHktVG8nID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJFbWFpbCcpLAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgfHwgJ2lzby04ODU5LTEnLAogICAgICAgICAgICAgICAgICAgIEJvZHkgPT4gJE5vdGlmeSwKICAgICAgICAgICAgICAgICAgICBMb29wID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudCA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lID0+ICIkUGFyYW17VGl0bGV9LmljcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRpQ2FsZW5kYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAidGV4dC9jYWxlbmRhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZyA9PiAncGxhaW4nLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCj1pdGVtIEV2ZW50Q2FuY2VsKCkKCmRlbGV0ZXMgYW4gZXZlbnQKCiAgICAkQ2FsZW5kYXJFdmVudE9iamVjdC0+RXZlbnRDYW5jZWwoCiAgICAgICAgRXZlbnRJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgRXZlbnRDYW5jZWwgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEV2ZW50SUQgVXNlcklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgc2VuZCBkZWxldGUgbm90aWZpY2F0aW9uCiAgICBteSAlRXZlbnQgPSAkU2VsZi0+RXZlbnRHZXQoJVBhcmFtKTsKICAgICMgbm90aWZ5CiAgICBpZiAoJEV2ZW50e1BhcnRpY2lwYW50SURzfSkgewogICAgICAgICMgbm90aWZ5CiAgICAgICAgbXkgJGlDYWxlbmRhciA9ICRTZWxmLT5faUNhbGVuZGFyTWVzc2FnZSgKICAgICAgICAgICAgRXZlbnRJRCA9PiAkUGFyYW17RXZlbnRJRH0sCiAgICAgICAgICAgIE1ldGhvZCA9PiAnQ0FOQ0VMJywKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgbXkgJE5vdGlmeSA9ICRTZWxmLT5fRW1haWxNZXNzYWdlKAogICAgICAgICAgICBFdmVudElEID0+ICRQYXJhbXtFdmVudElEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgZm9yZWFjaCBteSAkUGFydGljaXBhbnRJRHMgKEB7JEV2ZW50e1BhcnRpY2lwYW50SURzfX0pIHsKICAgICAgICAgICAgIyBvd25lciBsb29rdXAKICAgICAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFydGljaXBhbnRJRHMsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAjIHNlbmQgbm90aWZpY2F0aW9uCiAgICAgICAgICAgIGlmICgkVXNlcntVc2VyRW1haWx9KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1NlbmRtYWlsT2JqZWN0fS0+U2VuZCgKICAgICAgICAgICAgICAgICAgICBGcm9tID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJOYW1lJykuCiAgICAgICAgICAgICAgICAgICAgICAgICcgPCcuJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ05vdGlmaWNhdGlvblNlbmRlckVtYWlsJykuJz4nLAogICAgICAgICAgICAgICAgICAgIFRvID0+ICRVc2Vye1VzZXJFbWFpbH0sCiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PiAiW0V2ZW50L0NhbmNlbGVkXSAkRXZlbnR7VGl0bGV9IiwKICAgICAgICAgICAgICAgICAgICAgICAgJ1JlcGx5LVRvJyA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyRW1haWwnKSwKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Q2hhcnNldCcpIHx8ICdpc28tODg1OS0xJywKICAgICAgICAgICAgICAgICAgICBCb2R5ID0+ICIqKiogW0V2ZW50L0NhbmNlbGVkXSAqKipcbiROb3RpZnkiLAogICAgICAgICAgICAgICAgICAgIExvb3AgPT4gMSwKICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4gIiRFdmVudHtUaXRsZX0uaWNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJGlDYWxlbmRhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJ0ZXh0L2NhbGVuZGFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nID0+ICdwbGFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEV2ZW50SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwKICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICJERUxFVEUgRlJPTSBjYWxlbmRhcl9ldmVudCBXSEVSRSBpZCA9ICRQYXJhbXtFdmVudElEfSIpKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGNhbGVuZGFyX2V2ZW50X2ludm9sdmVkIFdIRVJFIGV2ZW50X2lkID0gJFBhcmFte0V2ZW50SUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQp9Cgo9aXRlbSBFdmVudEdldCgpCgpnZXQgYW4gZXZlbnQKCiAgICBteSAlRXZlbnQgPSAkQ2FsZW5kYXJFdmVudE9iamVjdC0+RXZlbnRHZXQoCiAgICAgICAgRXZlbnRJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgRXZlbnRHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJURhdGEgPSAoKTsKICAgIG15IEBQYXJ0aWNpcGFudElEcyA9ICgpOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEV2ZW50SUQgVXNlcklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEV2ZW50SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCB0aXRsZSwgY29udGVudCwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsIGVuZF90aW1lLCBzZXF1ZW5jZV9lbmRfdGltZSwgIi4KICAgICAgICAiIHNlcXVlbmNlX3R5cGUsIHJlbWluZGVyLCBvd25lcl9pZCwgZXZlbnRfc3RhdHVzLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5ICIuCiAgICAgICAgIiBGUk9NIGNhbGVuZGFyX2V2ZW50IFdIRVJFIGlkID0gJFBhcmFte0V2ZW50SUR9IjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICREYXRhe0V2ZW50SUR9ID0gJFBhcmFte0V2ZW50SUR9OwogICAgICAgICREYXRhe1RpdGxlfSA9ICRSb3dbMF0gfHwgJy0nOwogICAgICAgICREYXRhe0Rlc2NyaXB0aW9ufSA9ICRSb3dbMV0gfHwgJyc7CiAgICAgICAgJERhdGF7TG9jYXRpb259ID0gJFJvd1syXSB8fCAnJzsKICAgICAgICAkRGF0YXtTdGFydFRpbWV9ID0gJFJvd1szXSB8fCAnJzsKICAgICAgICAkRGF0YXtFbmRUaW1lfSA9ICRSb3dbNF0gfHwgJyc7CiAgICAgICAgJERhdGF7U2VxdWVuY2VFbmRUaW1lfSA9ICRSb3dbNV07CiAgICAgICAgJERhdGF7U2VxdWVuY2VUeXBlfSA9ICRSb3dbNl0gfHwgJ1NlcXVlbmNlVHlwZTo6Tm9uZSc7CiAgICAgICAgJERhdGF7UmVtaW5kZXJ9ID0gJFJvd1s3XTsKICAgICAgICAkRGF0YXtPcmdhbml6ZXJJRH0gPSAkUm93WzhdOwogICAgICAgICREYXRhe1N0YXRlfSA9ICRSb3dbOV07CiAgICAgICAgJERhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzEwXTsKICAgICAgICAkRGF0YXtDcmVhdGVCeX0gPSAkUm93WzExXTsKICAgICAgICAkRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbMTJdOwogICAgICAgICREYXRhe0NoYW5nZUJ5fSA9ICRSb3dbMTNdOwogICAgfQogICAgaWYgKCEkRGF0YXtFdmVudElEfSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBzdWNoIEV2ZW50SUQgJFBhcmFte0V2ZW50SUR9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAjIHNxbCBmb3IgaW52b2x2ZWQKICAgICRTUUwgPSAiU0VMRUNUIHVzZXJfaWQgIi4KICAgICAgICAiIEZST00gY2FsZW5kYXJfZXZlbnRfaW52b2x2ZWQgV0hFUkUgZXZlbnRfaWQgPSAkUGFyYW17RXZlbnRJRH0iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcHVzaCAoQFBhcnRpY2lwYW50SURzLCAkUm93WzBdKTsKICAgIH0KICAgICREYXRhe1BhcnRpY2lwYW50SURzfSA9IFxAUGFydGljaXBhbnRJRHM7CiAgICBteSAkU3RhcnRUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICREYXRhe1N0YXJ0VGltZX0sCiAgICApOwogICAgKAogICAgICAgICREYXRhe1N0YXJ0U2VjfSwKICAgICAgICAkRGF0YXtTdGFydE1pbnV0ZX0sCiAgICAgICAgJERhdGF7U3RhcnRIb3VyfSwKICAgICAgICAkRGF0YXtTdGFydERheX0sCiAgICAgICAgJERhdGF7U3RhcnRNb250aH0sCiAgICAgICAgJERhdGF7U3RhcnRZZWFyfQogICAgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICApOwoKICAgIG15ICRFbmRUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICREYXRhe0VuZFRpbWV9LAogICAgKTsKICAgICgKICAgICAgICAkRGF0YXtFbmRTZWN9LAogICAgICAgICREYXRhe0VuZE1pbnV0ZX0sCiAgICAgICAgJERhdGF7RW5kSG91cn0sCiAgICAgICAgJERhdGF7RW5kRGF5fSwKICAgICAgICAkRGF0YXtFbmRNb250aH0sCiAgICAgICAgJERhdGF7RW5kWWVhcn0KICAgICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICk7CiAgICBpZiAoJERhdGF7U2VxdWVuY2VFbmRUaW1lfSAmJiAkRGF0YXtTZXF1ZW5jZUVuZFRpbWV9ICF+IC9eMDAwMC8pIHsKICAgICAgICBteSAkU2VxdWVuY2VFbmRUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtTZXF1ZW5jZUVuZFRpbWV9LAogICAgICAgICk7CiAgICAgICAgKAogICAgICAgICAgICAkRGF0YXtTZXF1ZW5jZUVuZFNlY30sCiAgICAgICAgICAgICREYXRhe1NlcXVlbmNlRW5kTWludXRlfSwKICAgICAgICAgICAgJERhdGF7U2VxdWVuY2VFbmRIb3VyfSwKICAgICAgICAgICAgJERhdGF7U2VxdWVuY2VFbmREYXl9LAogICAgICAgICAgICAkRGF0YXtTZXF1ZW5jZUVuZE1vbnRofSwKICAgICAgICAgICAgJERhdGF7U2VxdWVuY2VFbmRZZWFyfQogICAgICAgICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlcXVlbmNlRW5kVGltZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAoJURhdGEpOwp9Cgo9aXRlbSBFdmVudHMoKQoKZ2V0IGV2ZW50cyBpbiB0aW1lIHNsb3QKCiAgICBteSBARXZlbnRJRHMgPSAkQ2FsZW5kYXJFdmVudE9iamVjdC0+RXZlbnRzKAogICAgICAgIFN0YXJ0VGltZSA9PiAnMTk3Ny0xMC0yNyAyMDoxNTowMCcsCiAgICAgICAgRW5kVGltZSA9PiAnMTk3Ny0xMC0yNyAyMTowMDowMCcsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7CgpvciBnZXQgZXZlbnRzIHdoZXJlIGFycmF5IG9mIHVzZXIgaWRzIGFyZSBpbnZvbGVkCgogICAgbXkgQEV2ZW50SURzID0gJENhbGVuZGFyRXZlbnRPYmplY3QtPkV2ZW50cygKICAgICAgICBTdGFydFRpbWUgPT4gJzE5NzctMTAtMjcgMjA6MTU6MDAnLAogICAgICAgIEVuZFRpbWUgPT4gJzE5NzctMTAtMjcgMjE6MDA6MDAnLAogICAgICAgIFVzZXJJRHMgPT4gWzEyMywgMzMsIDExXSwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCmluIEBFdmVudElEcyBhcmUgaGFzaCByZWZlcmVuY2VzIHdpdGggdGhlIGZvbGxvd2luZyBrZXlzCgogICAgRXZlbnRJRAogICAgVGl0bGUKICAgIERlc2NyaXB0aW9uCiAgICBTdGFydFRpbWUKICAgIEVuZFRpbWUKICAgIFN0YXRlCgo9Y3V0CgpzdWIgRXZlbnRzIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBFdmVudElEcyA9ICgpOwogICAgbXkgJVVzZWQgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdGFydFRpbWUgRW5kVGltZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJFN0YXJ0U3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICk7CiAgICBteSAkRW5kU3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICApOwogICAgbXkgKCRTU2VjLCAkU01pbiwgJFNIb3VyLCAkU0RheSwgJFNNb250aCwgJFNZZWFyKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFN5c3RlbVRpbWUsCiAgICApOwogICAgbXkgKCRFU2VjLCAkRU1pbiwgJEVIb3VyLCAkRURheSwgJEVNb250aCwgJEVZZWFyKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRTeXN0ZW1UaW1lLAogICAgKTsKICAgIG15ICREZWx0YSA9IERlbHRhX0RheXMoJFNZZWFyLCAkU01vbnRoLCAkU0RheSwgJEVZZWFyLCAkRU1vbnRoLCAkRURheSk7CgogICAgZm9yZWFjaCAoMC4uJERlbHRhKSB7CiAgICAgICAgbXkgKCRZZWFyMSwgJE1vbnRoMSwgJERheTEpID0gQWRkX0RlbHRhX0RheXMoJFNZZWFyLCAkU01vbnRoLCAkU0RheSwgJF8pOwogICAgICAgIG15ICgkWWVhcjIsICRNb250aDIsICREYXkyKSA9IEFkZF9EZWx0YV9EYXlzKCRTWWVhciwgJFNNb250aCwgJFNEYXksICRfKTsKICAgICAgICBpZiAoJF8gPT0gMCkgewogICAgICAgICAgICAkUGFyYW17U3RhcnRUaW1lfSA9ICIkWWVhcjEtJE1vbnRoMS0kRGF5MSAkU0hvdXI6JFNNaW46JFNTZWMiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1N0YXJ0VGltZX0gPSAiJFllYXIxLSRNb250aDEtJERheTEgMDA6MDA6MDAiOwogICAgICAgIH0KICAgICAgICBpZiAoJF8gPT0gJERlbHRhKSB7CiAgICAgICAgICAgICRQYXJhbXtFbmRUaW1lfSA9ICIkWWVhcjItJE1vbnRoMi0kRGF5MiAkRUhvdXI6JEVNaW46JEVTZWMiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte0VuZFRpbWV9ID0gIiRZZWFyMi0kTW9udGgyLSREYXkyIDIzOjU5OjU5IjsKICAgICAgICB9CiAgICAgICAgIyBkYiBxdW90ZQogICAgICAgIGZvcmVhY2ggKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgICAgIH0KICAgICAgICAjIHNxbAogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIGUuaWQsIGUudGl0bGUsIGUuY29udGVudCwgZS5zdGFydF90aW1lLCBlLmVuZF90aW1lLCBlLmV2ZW50X3N0YXR1cyAiLgogICAgICAgICAgICAiIEZST00gY2FsZW5kYXJfZXZlbnQgZSAiOwogICAgICAgIGlmICgkUGFyYW17VXNlcklEc30gJiYgQHskUGFyYW17VXNlcklEc319KSB7CiAgICAgICAgICAgICRTUUwgLj0gIiAsIGNhbGVuZGFyX2V2ZW50X2ludm9sdmVkIGVpICI7CiAgICAgICAgfQogICAgICAgICRTUUwgLj0gIiBXSEVSRSAiLgogICAgICAgICAgICAiICgoZS5zdGFydF90aW1lID49ICckUGFyYW17U3RhcnRUaW1lfScgQU5EIGUuZW5kX3RpbWUgPD0gJyRQYXJhbXtFbmRUaW1lfScpICIuCiAgICAgICAgICAgICIgT1IgIi4KICAgICAgICAgICAgIiAoZS5zdGFydF90aW1lID49ICckUGFyYW17U3RhcnRUaW1lfScgQU5EIGUuc3RhcnRfdGltZSA8PSAnJFBhcmFte0VuZFRpbWV9JykgIi4KICAgICAgICAgICAgIiBPUiAiLgogICAgICAgICAgICAiIChlLmVuZF90aW1lID49ICckUGFyYW17U3RhcnRUaW1lfScgQU5EIGUuZW5kX3RpbWUgPD0gJyRQYXJhbXtFbmRUaW1lfScpICIuCiAgICAgICAgICAgICIgT1IgIi4KICAgICAgICAgICAgIiAoZS5zdGFydF90aW1lIDw9ICckUGFyYW17U3RhcnRUaW1lfScgQU5EIGUuZW5kX3RpbWUgPj0gJyRQYXJhbXtFbmRUaW1lfScpKSAiOwogICAgICAgIGlmICgkUGFyYW17VXNlcklEc30gJiYgQHskUGFyYW17VXNlcklEc319KSB7CiAgICAgICAgICAgICRTUUwgLj0gIiBBTkQgZS5pZCA9IGVpLmV2ZW50X2lkIEFORCBlaS51c2VyX2lkIElOICgiOwogICAgICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgICAgICBmb3JlYWNoIChAeyRQYXJhbXtVc2VySURzfX0pIHsKICAgICAgICAgICAgICAgIGlmICgkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMIC49ICIsICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU1FMIC49ICIkXyI7CiAgICAgICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU1FMIC49ICIpIjsKICAgICAgICB9CiAgICAgICAgJFNRTCAuPSAiIE9SREVSIEJZIGUuc3RhcnRfdGltZSI7CgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgaWYgKCEkVXNlZHskUm93WzBdfSkgewogICAgICAgICAgICAgICAgbXkgJUV2ZW50ID0gKAogICAgICAgICAgICAgICAgICAgIEV2ZW50SUQgPT4gJFJvd1swXSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkUm93WzFdIHx8ICctJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkUm93WzJdLAogICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkUm93WzNdLAogICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgPT4gJFJvd1s0XSwKICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiAkUm93WzVdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEV2ZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEV2ZW50e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7U3RhcnRTZWN9LAogICAgICAgICAgICAgICAgICAgICRFdmVudHtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50e1N0YXJ0SG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50e1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7U3RhcnRNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50e1N0YXJ0WWVhcn0KICAgICAgICAgICAgICAgICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7RW5kU2VjfSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7RW5kTWludXRlfSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7RW5kSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50e0VuZERheX0sCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50e0VuZE1vbnRofSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7RW5kWWVhcn0KICAgICAgICAgICAgICAgICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIChARXZlbnRJRHMsIFwlRXZlbnQpOwogICAgICAgICAgICAgICAgJFVzZWR7JFJvd1swXX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICApOwogICAgICAgIG15ICgkU1NlYywgJFNNaW4sICRTSG91ciwgJFNEYXksICRTTW9udGgsICRTWWVhcikgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgJFNRTCA9ICJTRUxFQ1QgZS5pZCwgZS5zZXF1ZW5jZV90eXBlLCBlLnRpdGxlLCBlLmNvbnRlbnQsIGUuc3RhcnRfdGltZSwgZS5lbmRfdGltZSwgZS5ldmVudF9zdGF0dXMgIjsKICAgICAgICAkU1FMIC49ICIgRlJPTSBjYWxlbmRhcl9ldmVudCBlICI7CiAgICAgICAgaWYgKCRQYXJhbXtVc2VySURzfSAmJiBAeyRQYXJhbXtVc2VySURzfX0pIHsKICAgICAgICAgICAgJFNRTCAuPSAiICwgY2FsZW5kYXJfZXZlbnRfaW52b2x2ZWQgZWkgIjsKICAgICAgICB9CiAgICAgICAgJFNRTCAuPSAiIFdIRVJFICIuCiAgICAgICAgICAgICIgKChlLnN0YXJ0X3RpbWUgPj0gJyRQYXJhbXtTdGFydFRpbWV9JyBBTkQgZS5zZXF1ZW5jZV9lbmRfdGltZSA8PSAnJFBhcmFte0VuZFRpbWV9JykgIi4KICAgICAgICAgICAgIiBPUiAiLgogICAgICAgICAgICAiIChlLnN0YXJ0X3RpbWUgPj0gJyRQYXJhbXtTdGFydFRpbWV9JyBBTkQgZS5zdGFydF90aW1lIDw9ICckUGFyYW17RW5kVGltZX0nKSAiLgogICAgICAgICAgICAiIE9SICIuCiAgICAgICAgICAgICIgKGUuc2VxdWVuY2VfZW5kX3RpbWUgPj0gJyRQYXJhbXtTdGFydFRpbWV9JyBBTkQgZS5zZXF1ZW5jZV9lbmRfdGltZSA8PSAnJFBhcmFte0VuZFRpbWV9JykgIi4KICAgICAgICAgICAgIiBPUiAiLgogICAgICAgICAgICAiIChlLnN0YXJ0X3RpbWUgPD0gJyRQYXJhbXtTdGFydFRpbWV9JyBBTkQgZS5zZXF1ZW5jZV9lbmRfdGltZSA+PSAnJFBhcmFte0VuZFRpbWV9JykpICI7CiAgICAgICAgaWYgKCRQYXJhbXtVc2VySURzfSAmJiBAeyRQYXJhbXtVc2VySURzfX0pIHsKICAgICAgICAgICAgJFNRTCAuPSAiIEFORCBlLmlkID0gZWkuZXZlbnRfaWQgQU5EIGVpLnVzZXJfaWQgSU4gKCI7CiAgICAgICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgICAgIGZvcmVhY2ggKEB7JFBhcmFte1VzZXJJRHN9fSkgewogICAgICAgICAgICAgICAgaWYgKCRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICRTUUwgLj0gIiwgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTUUwgLj0gIiRfIjsKICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUwgLj0gIikiOwogICAgICAgIH0KICAgICAgICAkU1FMIC49ICIgT1JERVIgQlkgZS5zdGFydF90aW1lIjsKCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICBpZiAoISRVc2VkeyRSb3dbMF19KSB7CiAgICAgICAgICAgICAgICBteSAlRXZlbnQgPSAoCiAgICAgICAgICAgICAgICAgICAgRXZlbnRJRCA9PiAkUm93WzBdLAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRSb3dbMl0gfHwgJy0nLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRSb3dbM10sCiAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRSb3dbNF0sCiAgICAgICAgICAgICAgICAgICAgRW5kVGltZSA9PiAkUm93WzVdLAogICAgICAgICAgICAgICAgICAgIFN0YXRlID0+ICRSb3dbNl0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRXZlbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRXZlbnR7RW5kVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFRvdGFsID0gJEVuZFRpbWUtJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgIG15ICVFdmVudE9sZCA9ICgpOwogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICRFdmVudE9sZHtTdGFydFNlY30sCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50T2xke1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnRPbGR7U3RhcnRIb3VyfSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnRPbGR7U3RhcnREYXl9LAogICAgICAgICAgICAgICAgICAgICRFdmVudE9sZHtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnRPbGR7U3RhcnRZZWFyfQogICAgICAgICAgICAgICAgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICRFdmVudHtTdGFydFNlY30sCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50e1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7U3RhcnRIb3VyfSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7U3RhcnREYXl9LAogICAgICAgICAgICAgICAgICAgICRFdmVudHtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7U3RhcnRZZWFyfQogICAgICAgICAgICAgICAgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEV2ZW50e1N0YXJ0RGF5fSA9ICRTRGF5OwogICAgICAgICAgICAgICAgJEV2ZW50e1N0YXJ0TW9udGh9ID0gJFNNb250aDsKICAgICAgICAgICAgICAgICRFdmVudHtTdGFydFllYXJ9ID0gJFNZZWFyOwoKICAgICAgICAgICAgICAgIG15ICROZXdTdGFydFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gIiRFdmVudHtTdGFydFllYXJ9LSRFdmVudHtTdGFydE1vbnRofS0kRXZlbnR7U3RhcnREYXl9ICRFdmVudHtTdGFydEhvdXJ9OiRFdmVudHtTdGFydE1pbnV0ZX06JEV2ZW50e1N0YXJ0U2VjfSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJE5ld0VuZFRpbWUgPSAkTmV3U3RhcnRUaW1lKyRUb3RhbDsKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7RW5kU2VjfSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7RW5kTWludXRlfSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7RW5kSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50e0VuZERheX0sCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50e0VuZE1vbnRofSwKICAgICAgICAgICAgICAgICAgICAkRXZlbnR7RW5kWWVhcn0KICAgICAgICAgICAgICAgICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkTmV3RW5kVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRXZlbnR7U3RhcnRUaW1lfSA9ICIkRXZlbnR7U3RhcnRZZWFyfS0kRXZlbnR7U3RhcnRNb250aH0tJEV2ZW50e1N0YXJ0RGF5fSAkRXZlbnR7U3RhcnRIb3VyfTokRXZlbnR7U3RhcnRNaW51dGV9OiRFdmVudHtTdGFydFNlY30iOwogICAgICAgICAgICAgICAgJEV2ZW50e0VuZFRpbWV9ID0gIiRFdmVudHtFbmRZZWFyfS0kRXZlbnR7RW5kTW9udGh9LSRFdmVudHtFbmREYXl9ICRFdmVudHtFbmRIb3VyfTokRXZlbnR7RW5kTWludXRlfTokRXZlbnR7RW5kU2VjfSI7CgogICAgICAgICAgICAgICAgaWYgKCRSb3dbMV0gZXEgJ1llYXJseScgJiYgJEV2ZW50T2xke1N0YXJ0TW9udGh9ID09ICRTTW9udGggJiYKICAgICAgICAgICAgICAgICAgICAkRXZlbnRPbGR7U3RhcnREYXl9ID09ICRTRGF5ICYmCiAgICAgICAgICAgICAgICAgICAgKCgkTmV3U3RhcnRUaW1lID49ICRTdGFydFN5c3RlbVRpbWUgJiYgJE5ld0VuZFRpbWUgPD0gJEVuZFN5c3RlbVRpbWUpIHx8CiAgICAgICAgICAgICAgICAgICAgKCROZXdTdGFydFRpbWUgPj0gJFN0YXJ0U3lzdGVtVGltZSAmJiAkTmV3U3RhcnRUaW1lIDw9ICRFbmRTeXN0ZW1UaW1lKSB8fAogICAgICAgICAgICAgICAgICAgICgkTmV3RW5kVGltZSA+PSAkU3RhcnRTeXN0ZW1UaW1lICYmICROZXdFbmRUaW1lIDw9ICRFbmRTeXN0ZW1UaW1lKSB8fAogICAgICAgICAgICAgICAgICAgICgkTmV3U3RhcnRUaW1lIDw9ICRTdGFydFN5c3RlbVRpbWUgJiYgJE5ld0VuZFRpbWUgPj0gJEVuZFN5c3RlbVRpbWUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIChARXZlbnRJRHMsIFwlRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAkVXNlZHskUm93WzBdfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoJFJvd1sxXSA9fiAvXldlZWtseTo6KC4rPykkLyAmJgogICAgICAgICAgICAgICAgICAgICgoJE5ld1N0YXJ0VGltZSA+PSAkU3RhcnRTeXN0ZW1UaW1lICYmICROZXdFbmRUaW1lIDw9ICRFbmRTeXN0ZW1UaW1lKSB8fAogICAgICAgICAgICAgICAgICAgICgkTmV3U3RhcnRUaW1lID49ICRTdGFydFN5c3RlbVRpbWUgJiYgJE5ld1N0YXJ0VGltZSA8PSAkRW5kU3lzdGVtVGltZSkgfHwKICAgICAgICAgICAgICAgICAgICAoJE5ld0VuZFRpbWUgPj0gJFN0YXJ0U3lzdGVtVGltZSAmJiAkTmV3RW5kVGltZSA8PSAkRW5kU3lzdGVtVGltZSkgfHwKICAgICAgICAgICAgICAgICAgICAoJE5ld1N0YXJ0VGltZSA8PSAkU3RhcnRTeXN0ZW1UaW1lICYmICROZXdFbmRUaW1lID49ICRFbmRTeXN0ZW1UaW1lKSkpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ0RvdyA9ICQxOwogICAgICAgICAgICAgICAgICAgIG15ICREb3cgPSBEYXlfb2ZfV2Vla19BYmJyZXZpYXRpb24oRGF5X29mX1dlZWsoJFNZZWFyLCRTTW9udGgsJFNEYXkpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJERvdyBlcSAkQ0RvdykgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIChARXZlbnRJRHMsIFwlRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAkVXNlZHskUm93WzBdfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRSb3dbMV0gPX4gL15Nb250aGx5OjooLis/KTo6KC4rPykkLyAmJgogICAgICAgICAgICAgICAgICAgICgoJE5ld1N0YXJ0VGltZSA+PSAkU3RhcnRTeXN0ZW1UaW1lICYmICROZXdFbmRUaW1lIDw9ICRFbmRTeXN0ZW1UaW1lKSB8fAogICAgICAgICAgICAgICAgICAgICgkTmV3U3RhcnRUaW1lID49ICRTdGFydFN5c3RlbVRpbWUgJiYgJE5ld1N0YXJ0VGltZSA8PSAkRW5kU3lzdGVtVGltZSkgfHwKICAgICAgICAgICAgICAgICAgICAoJE5ld0VuZFRpbWUgPj0gJFN0YXJ0U3lzdGVtVGltZSAmJiAkTmV3RW5kVGltZSA8PSAkRW5kU3lzdGVtVGltZSkgfHwKICAgICAgICAgICAgICAgICAgICAoJE5ld1N0YXJ0VGltZSA8PSAkU3RhcnRTeXN0ZW1UaW1lICYmICROZXdFbmRUaW1lID49ICRFbmRTeXN0ZW1UaW1lKSkpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ0RvdyA9ICQxOwogICAgICAgICAgICAgICAgICAgIG15ICREb3dDb3VudCA9ICQyOwogICAgICAgICAgICAgICAgICAgIG15ICREYXlzID0gRGF5c19pbl9Nb250aCgkU1llYXIsJFNNb250aCk7CiAgICAgICAgICAgICAgICAgICAgbXkgJERvdyA9IERheV9vZl9XZWVrX0FiYnJldmlhdGlvbihEYXlfb2ZfV2VlaygkU1llYXIsJFNNb250aCwkU0RheSkpOwogICAgICAgICAgICAgICAgICAgIGlmICgkQ0RvdyBlcSAkRG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJERheSAoMS4uJFNEYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICREb3cgPSBEYXlfb2ZfV2Vla19BYmJyZXZpYXRpb24oRGF5X29mX1dlZWsoJFNZZWFyLCRTTW9udGgsJERheSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRDRG93IGVxICREb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJENvdW50ID09ICREb3dDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCAoQEV2ZW50SURzLCBcJUV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVc2VkeyRSb3dbMF19ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBARXZlbnRJRHM7Cgp9CgpzdWIgX1RpbWVTdGFtcDJJU09EYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdHJpbmcpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCRQYXJhbXtTdHJpbmd9ID1+IC8oXGRcZFxkXGQpLShcZFxkfFxkKS0oXGRcZHxcZCkgKFxkXGR8XGQpOihcZFxkfFxkKTooXGRcZHxcZCkvKSB7CiAgICAgICAgcmV0dXJuICIkMSQyJDNUJDQkNSQ2IjsKICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9pQ2FsZW5kYXJRdW90ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICRQYXJhbXtTdHJpbmd9ID1+IHMvXG4vXFxuLzsKICAgICRQYXJhbXtTdHJpbmd9ID1+IHMvLC9cXCwvOwogICAgcmV0dXJuICRQYXJhbXtTdHJpbmd9Owp9CgpzdWIgX2lDYWxlbmRhck1lc3NhZ2UgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEV2ZW50SUQgVXNlcklEIE1ldGhvZCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlRXZlbnQgPSAkU2VsZi0+RXZlbnRHZXQoJVBhcmFtKTsKICAgIG15ICVPcmdhbml6ZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEV2ZW50e09yZ2FuaXplcklEfSwKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKICAgICMgYnVpbGQgdmNhbGVuZGVyIGF0dGFjaG1lbnQKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICAkTWVzc2FnZSAuPSJCRUdJTjpWQ0FMRU5EQVJcbiI7CiAgICAkTWVzc2FnZSAuPSJWRVJTSU9OOjIuMFxuIjsKICAgICRNZXNzYWdlIC49IlBST0RJRDoiLiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykuIiBDYWxlbmRhciAoIi4kU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVmVyc2lvbicpLiIpXG4iOwogICAgJE1lc3NhZ2UgLj0iTUVUSE9EOiIuJFNlbGYtPl9pQ2FsZW5kYXJRdW90ZShTdHJpbmcgPT4gJFBhcmFte01ldGhvZH0pLiJcbiI7CiAgICAkTWVzc2FnZSAuPSJCRUdJTjpWRVZFTlRcbiI7CiAgICAkTWVzc2FnZSAuPSJVSUQ6ICRFdmVudHtFdmVudElEfS1cQCIuJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZRRE4nKS4iXG4iOwogICAgJE1lc3NhZ2UgLj0iT1JHQU5JWkVSO0NOPVwiJE9yZ2FuaXplcntVc2VyRmlyc3RuYW1lfSAkT3JnYW5pemVye1VzZXJMYXN0bmFtZX1cIjpNQUlMVE86JE9yZ2FuaXplcntVc2VyRW1haWx9XG4iOwogICAgZm9yZWFjaCBteSAkUGFydGljaXBhbnRJRCAoQHskRXZlbnR7UGFydGljaXBhbnRJRHN9fSkgewogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFydGljaXBhbnRJRCwKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgICRNZXNzYWdlIC49IkFUVEVOREVFO1JPTEU9UkVRLVBBUlRJQ0lQQU5UO1JTVlA9VFJVRTpNQUlMVE86JFVzZXJ7VXNlckVtYWlsfVxuIjsKICAgIH0KICAgICRNZXNzYWdlIC49IlNVTU1BUlk6Ii4kU2VsZi0+X2lDYWxlbmRhclF1b3RlKFN0cmluZyA9PiAkRXZlbnR7VGl0bGV9KS4iXG4iOwogICAgJE1lc3NhZ2UgLj0iREVTQ1JJUFRJT046Ii4kU2VsZi0+X2lDYWxlbmRhclF1b3RlKFN0cmluZyA9PiAkRXZlbnR7RGVzY3JpcHRpb259KS4iXG4iOwogICAgJE1lc3NhZ2UgLj0iTE9DQVRJT046Ii4kU2VsZi0+X2lDYWxlbmRhclF1b3RlKFN0cmluZyA9PiAkRXZlbnR7TG9jYXRpb259KS4iXG4iOwogICAgJE1lc3NhZ2UgLj0iQ0xBU1M6UFVCTElDXG4iOwogICAgJE1lc3NhZ2UgLj0iRFRTVEFSVDoiLiRTZWxmLT5fVGltZVN0YW1wMklTT0RhdGUoU3RyaW5nID0+ICRFdmVudHtTdGFydFRpbWV9KS4iXG4iOwogICAgJE1lc3NhZ2UgLj0iRFRFTkQ6Ii4kU2VsZi0+X1RpbWVTdGFtcDJJU09EYXRlKFN0cmluZyA9PiAkRXZlbnR7RW5kVGltZX0pLiJcbiI7CiAgICAkTWVzc2FnZSAuPSJEVFNUQU1QOiIuJFNlbGYtPl9UaW1lU3RhbXAySVNPRGF0ZShTdHJpbmcgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+Q3VycmVudFRpbWVzdGFtcCgpKS4iXG4iOwogICAgJE1lc3NhZ2UgLj0iQ0FURUdPUklFUzoiLiRTZWxmLT5faUNhbGVuZGFyUXVvdGUoU3RyaW5nID0+ICRFdmVudHtTdGF0ZX0pLiJcbiI7CiAgICAkTWVzc2FnZSAuPSJUUkFOU1A6T1BBUVVFXG4iOwogICAgJE1lc3NhZ2UgLj0iRU5EOlZFVkVOVFxuIjsKICAgICRNZXNzYWdlIC49IkVORDpWQ0FMRU5EQVJcbiI7CiAgICByZXR1cm4gJE1lc3NhZ2U7Cn0KCnN1YiBfRW1haWxNZXNzYWdlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhFdmVudElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlRXZlbnQgPSAkU2VsZi0+RXZlbnRHZXQoJVBhcmFtKTsKICAgIG15ICVPcmdhbml6ZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEV2ZW50e09yZ2FuaXplcklEfSwKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKICAgIG15ICVDdXJyZW50VXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKICAgIG15ICROb3RpZnkgPSAiVGl0bGU6ICAgICAgICRFdmVudHtUaXRsZX1cbiI7CiAgICAkTm90aWZ5IC49ICJMb2NhdGlvbjogICAgJEV2ZW50e0xvY2F0aW9ufVxuIjsKICAgICROb3RpZnkgLj0gIlN0YXJ0OiAgICAgICAkRXZlbnR7U3RhcnRUaW1lfVxuIjsKICAgICROb3RpZnkgLj0gIkVuZDogICAgICAgICAkRXZlbnR7RW5kVGltZX1cbiI7CiAgICAkTm90aWZ5IC49ICJPcmdhbml6ZXI6ICAgJE9yZ2FuaXplcntVc2VyRmlyc3RuYW1lfSAkT3JnYW5pemVye1VzZXJMYXN0bmFtZX0gKCRPcmdhbml6ZXJ7VXNlckxvZ2lufSlcbiI7CiAgICAkTm90aWZ5IC49ICJUeXBlOiAgICAgICAgJEV2ZW50e1N0YXRlfVxuIjsKICAgICROb3RpZnkgLj0gIlBhcnRpY2lwYW50OiBcbiI7CiAgICBteSAkUGFydGljaXBhbnQgPSAnJzsKICAgIGZvcmVhY2ggbXkgJFBhcnRpY2lwYW50SUQgKEB7JEV2ZW50e1BhcnRpY2lwYW50SURzfX0pIHsKICAgICAgICAjIG93bmVyIGxvb2t1cAogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcnRpY2lwYW50SUQsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJE5vdGlmeSAuPSAiICAgICAgICAgICAgIG8gJFVzZXJ7VXNlckZpcnN0bmFtZX0gJFVzZXJ7VXNlckxhc3RuYW1lfSAoJFVzZXJ7VXNlckxvZ2lufSlcbiI7CiAgICB9CiAgICAkTm90aWZ5IC49ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwogICAgJE5vdGlmeSAuPSAiJEV2ZW50e0Rlc2NyaXB0aW9ufVxuIjsKICAgICROb3RpZnkgLj0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CiAgICAkTm90aWZ5IC49ICJCeTogJEN1cnJlbnRVc2Vye1VzZXJGaXJzdG5hbWV9ICRDdXJyZW50VXNlcntVc2VyTGFzdG5hbWV9ICgkQ3VycmVudFVzZXJ7VXNlckxvZ2lufSlcbiI7CiAgICByZXR1cm4gJE5vdGlmeTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMyAkICREYXRlOiAyMDA4LzAzLzA0IDExOjE2OjI0ICQKCj1jdXQK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50Q2FsZW5kYXIucG0gLSBhIGNhbGVuZGFyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50Q2FsZW5kYXIucG0sdiAxLjE3IDIwMDcvMDMvMDUgMDE6Mjk6MDAgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2UgRGF0ZTo6UGNhbGMgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXJFdmVudDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjE3ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBPcGplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCBUaW1lT2JqZWN0KSkgewogICAgICAgIGlmICghJFNlbGYtPnskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKTsKICAgICAgICB9CiAgICB9CiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NhbGVuZGFyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhckV2ZW50LT5uZXcoJVBhcmFtKTsKICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57Q0ZETn0gPSBbLTcsIC0yLCArMSwgKzM5LCArNDksICs1MCwgKzYwXTsKICAgICRTZWxmLT57Q0ZEfSA9IFsiUGFsbSBTdW5kYXkiLCAiRWFzdGVyIEZyaWRheSIsICJFYXN0ZXIgTW9uZGF5IiwgIkFzY2Vuc2lvbiBvZiBDaHJpc3QiLCAiV2hpdHN1bmRheSIsICJXaGl0bW9uZGF5IiwgIkZlYXN0IG9mIENvcnB1cyBDaHJpc3RpIl07CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJE91dHB1dDsKCiAgICAjIHBhcmFtIGluaXQuCiAgICAkU2VsZi0+e1ZpZXd9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdWaWV3JykgfHwgJFNlbGYtPntDYWxlbmRhclZpZXd9IHx8ICdXZWVrNSc7CiAgICAkU2VsZi0+e1llYXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdZZWFyJykgfHwgJyc7CiAgICAkU2VsZi0+e01vbnRofSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnTW9udGgnKSB8fCAnJzsKICAgICRTZWxmLT57RGF5fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRGF5JykgfHwgJyc7CiAgICAkU2VsZi0+e0JvZHl9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdCb2R5JykgfHwgJyc7CiAgICAkU2VsZi0+e1ByaW50fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpbnQnKSB8fCAnJzsKICAgICRTZWxmLT57TWVtYmVyc30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ01lbWJlcnMnKSB8fCAkU2VsZi0+e0NhbGVuZGFyVmlld01lbWJlcnN9IHx8ICcnOwoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSA9PiAnQ2FsZW5kYXJWaWV3TWVtYmVycycsCiAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntNZW1iZXJzfSwKICAgICk7CiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgPT4gJ0NhbGVuZGFyVmlldycsCiAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntWaWV3fSwKICAgICk7CiAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIEtleSA9PiAnQ2FsZW5kYXJWaWV3JywKICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e1ZpZXd9LAogICAgKTsKCiAgICAjIG11c3QgZmllbGRzLgogICAgIyBnZXQgdG9kYXkKICAgIG15ICgkU2VjLCAkTWluLCAkSG91ciwgJFREYXksICRUTW9udGgsICRUWWVhcikgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgaWYgKCAhJFNlbGYtPntZZWFyfSApIHsKICAgICAgICAkU2VsZi0+e1llYXJ9ID0gJFRZZWFyOwogICAgfQogICAgaWYgKCAhJFNlbGYtPntNb250aH0gKSB7CiAgICAgICAgJFNlbGYtPntNb250aH0gPSAkVE1vbnRoOwogICAgfQogICAgaWYgKCAhJFNlbGYtPntEYXl9ICkgewogICAgICAgICRTZWxmLT57RGF5fSA9ICRURGF5OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjcmVhdGUgbmV3IGV2ZW50CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGUnKSB7CiAgICAgICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgZm9yZWFjaCAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsiU3RhcnQkXyJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdGFydCRfIikgfHwgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICAgICAgJEdldFBhcmFteyJFbmQkXyJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbmQkXyIpIHx8ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZCgkR2V0UGFyYW17U3RhcnRIb3VyfSkpIHsKICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0SG91cn0gPSAnMDgnOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWQoJEdldFBhcmFte0VuZEhvdXJ9KSkgewogICAgICAgICAgICAkR2V0UGFyYW17RW5kSG91cn0gPSAnMDknOwogICAgICAgIH0KICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6Tm9uZSd9ID0gJ2NoZWNrZWQnOwogICAgICAgICRGcm9udGVuZHtTdGFydERhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFByZWZpeCA9PiAnU3RhcnQnLAojICAgICAgICAgICAgRGlmZlRpbWUgPT4gNjAqNjAsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgU3RhcnRNaW51dGUgPT4gJzAwJywKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtFbmREYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBQcmVmaXggPT4gJ0VuZCcsCiMgICAgICAgICAgICBEaWZmVGltZSA9PiA2MCo2MCoyLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEVuZE1pbnV0ZSA9PiAnMDAnLAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke1NlcXVlbmNlRW5kRGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgWWVhckRpZmYgPT4gNTAsCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFByZWZpeCA9PiAnU2VxdWVuY2VFbmQnLAojICAgICAgICAgICAgRGlmZlRpbWUgPT4gNjAqNjAqMjQqMzY1KjEwLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFNlcXVlbmNlRW5kWWVhciA9PiAnMjAzMCcsCiAgICAgICAgICAgIFNlcXVlbmNlRW5kSG91ciA9PiAnNTknLAogICAgICAgICAgICBTZXF1ZW5jZUVuZE1pbnV0ZSA9PiAnMDAnLAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke1N0YXRlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgcHJpdmF0ZSA9PiAncHJpdmF0ZScsCiAgICAgICAgICAgICAgICBwdWJsaWMgPT4gJ3B1YmxpYycsCiAgICAgICAgICAgICAgICB2YWNhdGlvbiA9PiAndmFjYXRpb24nLAogICAgICAgICAgICAgICAgbWVldGluZyA9PiAnbWVldGluZycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U3RhdGV9IHx8ICdwdWJsaWMnLAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke01vbnRobHlTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxLiBmaXJzdCcsCiAgICAgICAgICAgICAgICAyID0+ICcyLiBzZWNvbmQnLAogICAgICAgICAgICAgICAgMyA9PiAnMy4gdGhpcmQnLAogICAgICAgICAgICAgICAgNCA9PiAnNC4gZm91cnRoJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSA9PiAnTW9udGhseVR5cGUnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtNb250aGx5VHlwZX0gfHwgJycsCiAgICAgICAgKTsKICAgICAgICAkRnJvbnRlbmR7UmVtaW5kZXJ9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnJyA9PiAnLScsCiAgICAgICAgICAgICAgICAxNSA9PiAnMTUgTWludXRlcycsCiAgICAgICAgICAgICAgICAzMCA9PiAnMzAgTWludXRlcycsCiAgICAgICAgICAgICAgICA0NSA9PiAnNDUgTWludXRlcycsCiAgICAgICAgICAgICAgICA2MCA9PiAnMSBIb3VyJywKICAgICAgICAgICAgICAgIDEyMCA9PiAnMiBIb3VycycsCiAgICAgICAgICAgICAgICAyNDAgPT4gJzQgSG91cnMnLAogICAgICAgICAgICAgICAgMzYwMCA9PiAnMSBEYXknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOYW1lID0+ICdSZW1pbmRlcicsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1JlbWluZGVyfSB8fCAnJywKICAgICAgICApOwogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke1BhcnRpY2lwYW50TGlzdH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgTmFtZSA9PiAnUGFydGljaXBhbnRJRHMnLAogICAgICAgICAgICBNdWx0aXBsZSA9PiAxLAogICAgICAgICAgICBTaXplID0+IDUsCiAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiBbJFNlbGYtPntVc2VySUR9XSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDcmVhdGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFllYXIgPT4gJFNlbGYtPntZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRTZWxmLT57TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ID0+ICRTZWxmLT57RGF5fSwKICAgICAgICAgICAgICAgICVGcm9udGVuZCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdOZXcnKTsKICAgICAgICAjIGJ1aWxkIE5hdmlnYXRpb25CYXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRDYWxlbmRhcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGF5ID0+ICRTZWxmLT57RGF5fSwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRTZWxmLT57TW9udGh9LAogICAgICAgICAgICAgICAgWWVhciA9PiAkU2VsZi0+e1llYXJ9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjcmVhdGUgbmV3IGV2ZW50CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVBY3Rpb24nKSB7CiAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgZm9yZWFjaCAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsiU3RhcnQkXyJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdGFydCRfIik7CiAgICAgICAgICAgICRHZXRQYXJhbXsiRW5kJF8ifSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiRW5kJF8iKTsKICAgICAgICAgICAgJEdldFBhcmFteyJTZXF1ZW5jZUVuZCRfIn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlNlcXVlbmNlRW5kJF8iKTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAocXcoTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17IlN0YXJ0JF8ifSA9IHNwcmludGYoIiUwMmQiLCAkR2V0UGFyYW17IlN0YXJ0JF8ifSk7CiAgICAgICAgICAgICRHZXRQYXJhbXsiRW5kJF8ifSA9IHNwcmludGYoIiUwMmQiLCAkR2V0UGFyYW17IkVuZCRfIn0pOwogICAgICAgICAgICAkR2V0UGFyYW17IlNlcXVlbmNlRW5kJF8ifSA9IHNwcmludGYoIiUwMmQiLCAkR2V0UGFyYW17IlNlcXVlbmNlRW5kJF8ifSk7CiAgICAgICAgfQogICAgICAgICMgdHJhbnNmb3JtIHRpbWUgc2VsZWN0aW9uLCBzdXBwb3J0IHRpbWUgem9uZXMKICAgICAgICBteSAlVGltZVN0YXJ0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zyb21EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFByZWZpeCA9PiAiU3RhcnQiLAogICAgICAgICk7CiAgICAgICAgbXkgJVRpbWVFbmQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUHJlZml4ID0+ICJFbmQiLAogICAgICAgICk7CiAgICAgICAgbXkgJVRpbWVTZXF1ZW5jZUVuZCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gIlNlcXVlbmNlRW5kIiwKICAgICAgICApOwogICAgICAgIGZvcmVhY2ggKHF3KFRpdGxlIERlc2NyaXB0aW9uIExvY2F0aW9uIFN0YXRlIFNlcXVlbmNlVHlwZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQogICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gIiRUaW1lU3RhcnR7U3RhcnRZZWFyfS0kVGltZVN0YXJ0e1N0YXJ0TW9udGh9LSRUaW1lU3RhcnR7U3RhcnREYXl9ICIuCiAgICAgICAgICAgICIkVGltZVN0YXJ0e1N0YXJ0SG91cn06JFRpbWVTdGFydHtTdGFydE1pbnV0ZX06MDAiOwogICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICIkVGltZUVuZHtFbmRZZWFyfS0kVGltZUVuZHtFbmRNb250aH0tJFRpbWVFbmR7RW5kRGF5fSAiLgogICAgICAgICAgICAiJFRpbWVFbmR7RW5kSG91cn06JFRpbWVFbmR7RW5kTWludXRlfTowMCI7CiAgICAgICAgJEdldFBhcmFte1NlcXVlbmNlRW5kVGltZX0gPSAiJFRpbWVTZXF1ZW5jZUVuZHtTZXF1ZW5jZUVuZFllYXJ9LSRUaW1lU2VxdWVuY2VFbmR7U2VxdWVuY2VFbmRNb250aH0tJFRpbWVTZXF1ZW5jZUVuZHtTZXF1ZW5jZUVuZERheX0gIi4KICAgICAgICAgICAgIiRUaW1lU2VxdWVuY2VFbmR7U2VxdWVuY2VFbmRIb3VyfTokVGltZVNlcXVlbmNlRW5ke1NlcXVlbmNlRW5kTWludXRlfTowMCI7CiAgICAgICAgbXkgQFBhcnRpY2lwYW50SURzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KFBhcmFtID0+ICdQYXJ0aWNpcGFudElEcycpOwogICAgICAgICRHZXRQYXJhbXtQYXJ0aWNpcGFudElEc30gPSBcQFBhcnRpY2lwYW50SURzOwogICAgICAgIGlmICgkU2VsZi0+e0NhbGVuZGFyT2JqZWN0fS0+RXZlbnRBZGQoJUdldFBhcmFtLCBPcmdhbml6ZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAjIGVycm9yIHNjcmVlbgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZWRpdCBldmVudAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBkYXRlJykgewogICAgICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgICAgIGZvcmVhY2ggKHF3KEV2ZW50SUQpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KICAgICAgICAjIGdldCBldmVudAogICAgICAgIG15ICVFdmVudCA9ICRTZWxmLT57Q2FsZW5kYXJPYmplY3R9LT5FdmVudEdldCglR2V0UGFyYW0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgICAgIGlmICgkRXZlbnR7U3RhdGV9ID1+IC9wcml2YXRlL2kgJiYgJEV2ZW50e09yZ2FuaXplcklEfSBuZSAkU2VsZi0+e1VzZXJJRH0pIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvcmVhY2ggKEB7JEV2ZW50e09yZ2FuaXplcklEc319KSB7CiAgICAgICAgICAgICAgICBpZiAoJF8gZXEgJFNlbGYtPntVc2VySUR9KSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkSGl0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRFdmVudHtTZXF1ZW5jZVR5cGV9ID1+IC9eKE1vbnRobHk6Oi4uLik6OiguKz8pJC8pIHsKICAgICAgICAgICAgJEV2ZW50eydTZXF1ZW5jZVR5cGUnfSA9ICQxOwogICAgICAgICAgICAkRXZlbnR7J01vbnRobHlUeXBlJ30gPSAkMjsKICAgICAgICB9CiAgICAgICAgaWYgKCRFdmVudHtTZXF1ZW5jZVR5cGV9IGVxICdZZWFybHknKSB7CiAgICAgICAgICAgICRGcm9udGVuZHsnU2VxdWVuY2VUeXBlOjpZZWFybHknfSA9ICdjaGVja2VkJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRFdmVudHtTZXF1ZW5jZVR5cGV9IGVxICdXZWVrbHk6Ok1vbicpIHsKICAgICAgICAgICAgJEZyb250ZW5keydTZXF1ZW5jZVR5cGU6OldlZWtseTo6TW9uJ30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXZlbnR7U2VxdWVuY2VUeXBlfSBlcSAnV2Vla2x5OjpUdWUnKSB7CiAgICAgICAgICAgICRGcm9udGVuZHsnU2VxdWVuY2VUeXBlOjpXZWVrbHk6OlR1ZSd9ID0gJ2NoZWNrZWQnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJEV2ZW50e1NlcXVlbmNlVHlwZX0gZXEgJ1dlZWtseTo6V2VkJykgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6V2Vla2x5OjpXZWQnfSA9ICdjaGVja2VkJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRFdmVudHtTZXF1ZW5jZVR5cGV9IGVxICdXZWVrbHk6OlRodScpIHsKICAgICAgICAgICAgJEZyb250ZW5keydTZXF1ZW5jZVR5cGU6OldlZWtseTo6VGh1J30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXZlbnR7U2VxdWVuY2VUeXBlfSBlcSAnV2Vla2x5OjpGcmknKSB7CiAgICAgICAgICAgICRGcm9udGVuZHsnU2VxdWVuY2VUeXBlOjpXZWVrbHk6OkZyaSd9ID0gJ2NoZWNrZWQnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJEV2ZW50e1NlcXVlbmNlVHlwZX0gZXEgJ1dlZWtseTo6U2F0JykgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6V2Vla2x5OjpTYXQnfSA9ICdjaGVja2VkJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRFdmVudHtTZXF1ZW5jZVR5cGV9IGVxICdXZWVrbHk6OlN1bicpIHsKICAgICAgICAgICAgJEZyb250ZW5keydTZXF1ZW5jZVR5cGU6OldlZWtseTo6U3VuJ30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXZlbnR7U2VxdWVuY2VUeXBlfSBlcSAnTW9udGhseTo6TW9uJykgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6TW9udGhseTo6TW9uJ30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXZlbnR7U2VxdWVuY2VUeXBlfSBlcSAnTW9udGhseTo6VHVlJykgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6TW9udGhseTo6VHVlJ30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXZlbnR7U2VxdWVuY2VUeXBlfSBlcSAnTW9udGhseTo6V2VkJykgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6TW9udGhseTo6V2VkJ30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXZlbnR7U2VxdWVuY2VUeXBlfSBlcSAnTW9udGhseTo6VGh1JykgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6TW9udGhseTo6VGh1J30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXZlbnR7U2VxdWVuY2VUeXBlfSBlcSAnTW9udGhseTo6RnJpJykgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6TW9udGhseTo6RnJpJ30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXZlbnR7U2VxdWVuY2VUeXBlfSBlcSAnTW9udGhseTo6U2F0JykgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6TW9udGhseTo6U2F0J30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXZlbnR7U2VxdWVuY2VUeXBlfSBlcSAnTW9udGhseTo6U3VuJykgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6TW9udGhseTo6U3VuJ30gPSAnY2hlY2tlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRnJvbnRlbmR7J1NlcXVlbmNlVHlwZTo6Tm9uZSd9ID0gJ2NoZWNrZWQnOwogICAgICAgIH0KICAgICAgICAkRnJvbnRlbmR7U3RhcnREYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBQcmVmaXggPT4gJ1N0YXJ0JywKICAgICAgICAgICAgJUV2ZW50LAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke0VuZERhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFByZWZpeCA9PiAnRW5kJywKICAgICAgICAgICAgJUV2ZW50LAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke1NlcXVlbmNlRW5kRGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgUHJlZml4ID0+ICdTZXF1ZW5jZUVuZCcsCiAgICAgICAgICAgICVFdmVudCwKICAgICAgICAgICAgWWVhckRpZmYgPT4gNTAsCiAgICAgICAgKTsKICAgICAgICAkRnJvbnRlbmR7U3RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBwcml2YXRlID0+ICdwcml2YXRlJywKICAgICAgICAgICAgICAgIHB1YmxpYyA9PiAncHVibGljJywKICAgICAgICAgICAgICAgIHZhY2F0aW9uID0+ICd2YWNhdGlvbicsCiAgICAgICAgICAgICAgICBtZWV0aW5nID0+ICdtZWV0aW5nJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRFdmVudHtTdGF0ZX0gfHwgJ3B1YmxpYycsCiAgICAgICAgKTsKICAgICAgICAkRnJvbnRlbmR7TW9udGhseVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEuIGZpcnN0JywKICAgICAgICAgICAgICAgIDIgPT4gJzIuIHNlY29uZCcsCiAgICAgICAgICAgICAgICAzID0+ICczLiB0aGlyZCcsCiAgICAgICAgICAgICAgICA0ID0+ICc0LiBmb3VydGgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOYW1lID0+ICdNb250aGx5VHlwZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEV2ZW50e01vbnRobHlUeXBlfSB8fCAnJywKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtSZW1pbmRlclN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICcnID0+ICcgIC0gJywKICAgICAgICAgICAgICAgIDE1ID0+ICcgIDE1IE1pbnV0ZXMnLAogICAgICAgICAgICAgICAgMzAgPT4gJyAgMzAgTWludXRlcycsCiAgICAgICAgICAgICAgICA0NSA9PiAnICA0NSBNaW51dGVzJywKICAgICAgICAgICAgICAgIDYwID0+ICcgMSBIb3VyJywKICAgICAgICAgICAgICAgIDEyMCA9PiAnIDIgSG91cnMnLAogICAgICAgICAgICAgICAgMjQwID0+ICcgNCBIb3VycycsCiAgICAgICAgICAgICAgICA0ODAgPT4gJyA4IEhvdXJzJywKICAgICAgICAgICAgICAgIDM2MDAgPT4gJzEgRGF5JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSA9PiAnUmVtaW5kZXInLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtSZW1pbmRlcn0gfHwgJycsCiAgICAgICAgKTsKICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtQYXJ0aWNpcGFudExpc3R9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIE5hbWUgPT4gJ1BhcnRpY2lwYW50SURzJywKICAgICAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICAgICAgU2l6ZSA9PiA1LAogICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJEV2ZW50e1BhcnRpY2lwYW50SURzfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFllYXIgPT4gJFNlbGYtPntZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRTZWxmLT57TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ID0+ICRTZWxmLT57RGF5fSwKICAgICAgICAgICAgICAgICVGcm9udGVuZCwKICAgICAgICAgICAgICAgICVFdmVudCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICMgY3JlYXRlZAogICAgICAgIGlmICgkRXZlbnR7Q3JlYXRlQnl9KSB7CiAgICAgICAgICAgIG15ICVDcmVhdGVCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRFdmVudHtDcmVhdGVCeX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVDcmVhdGVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVFdmVudCwKICAgICAgICAgICAgICAgICAgICAlQ3JlYXRlQnksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIGNoYW5nZWQKICAgICAgICBpZiAoJEV2ZW50e0NoYW5nZUJ5fSkgewogICAgICAgICAgICBteSAlQ2hhbmdlQnkgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRXZlbnR7Q2hhbmdlQnl9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlQ2hhbmdlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZUJ5LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ0VkaXQnKTsKICAgICAgICAjIGJ1aWxkIE5hdmlnYXRpb25CYXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRDYWxlbmRhcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGF5ID0+ICRTZWxmLT57RGF5fSwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRTZWxmLT57TW9udGh9LAogICAgICAgICAgICAgICAgWWVhciA9PiAkU2VsZi0+e1llYXJ9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB1cGRhdGUgZXZlbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZUFjdGlvbicpIHsKICAgICAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgICAgICBmb3JlYWNoIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyJTdGFydCRfIn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN0YXJ0JF8iKTsKICAgICAgICAgICAgJEdldFBhcmFteyJFbmQkXyJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbmQkXyIpOwogICAgICAgICAgICAkR2V0UGFyYW17IlNlcXVlbmNlRW5kJF8ifSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU2VxdWVuY2VFbmQkXyIpOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoIChxdyhNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsiU3RhcnQkXyJ9ID0gc3ByaW50ZigiJTAyZCIsICRHZXRQYXJhbXsiU3RhcnQkXyJ9KTsKICAgICAgICAgICAgJEdldFBhcmFteyJFbmQkXyJ9ID0gc3ByaW50ZigiJTAyZCIsICRHZXRQYXJhbXsiRW5kJF8ifSk7CiAgICAgICAgICAgICRHZXRQYXJhbXsiU2VxdWVuY2VFbmQkXyJ9ID0gc3ByaW50ZigiJTAyZCIsICRHZXRQYXJhbXsiU2VxdWVuY2VFbmQkXyJ9KTsKICAgICAgICB9CiAgICAgICAgIyB0cmFuc2Zvcm0gdGltZSBzZWxlY3Rpb24sIHN1cHBvcnQgdGltZSB6b25lcwogICAgICAgIG15ICVUaW1lU3RhcnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUHJlZml4ID0+ICJTdGFydCIsCiAgICAgICAgKTsKICAgICAgICBteSAlVGltZUVuZCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gIkVuZCIsCiAgICAgICAgKTsKICAgICAgICBteSAlVGltZVNlcXVlbmNlRW5kID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zyb21EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFByZWZpeCA9PiAiU2VxdWVuY2VFbmQiLAogICAgICAgICk7CiAgICAgICAgZm9yZWFjaCAocXcoRXZlbnRJRCBUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbiBTdGF0ZSBTZXF1ZW5jZVR5cGUgQ2FuY2VsIE1vbnRobHlUeXBlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRHZXRQYXJhbXtTZXF1ZW5jZVR5cGV9ID1+IC9eTW9udGhseTo6LykgewogICAgICAgICAgICAkR2V0UGFyYW17U2VxdWVuY2VUeXBlfSAuPSAnOjonLiRHZXRQYXJhbXtNb250aGx5VHlwZX07CiAgICAgICAgfQogICAgICAgICMgY2hlY2sgZGVsZXRlCiAgICAgICAgaWYgKCRHZXRQYXJhbXtDYW5jZWx9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUNhbmNlbCZFdmVudElEPSRHZXRQYXJhbXtFdmVudElEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15IEBQYXJ0aWNpcGFudElEcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAnUGFydGljaXBhbnRJRHMnKTsKICAgICAgICAkR2V0UGFyYW17UGFydGljaXBhbnRJRHN9ID0gXEBQYXJ0aWNpcGFudElEczsKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb24KICAgICAgICBteSAlRXZlbnQgPSAkU2VsZi0+e0NhbGVuZGFyT2JqZWN0fS0+RXZlbnRHZXQoJUdldFBhcmFtLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICBpZiAoJEV2ZW50e1N0YXRlfSA9fiAvcHJpdmF0ZS9pICYmICRFdmVudHtVc2VySUR9IG5lICRTZWxmLT57VXNlcklEfSkgewogICAgICAgICAgICBteSAkSGl0ID0gMDsKICAgICAgICAgICAgZm9yZWFjaCAoQHskRXZlbnR7UGFydGljaXBhbnRJRHN9fSkgewogICAgICAgICAgICAgICAgaWYgKCRfIGVxICRTZWxmLT57VXNlcklEfSkgewogICAgICAgICAgICAgICAgICAgICRIaXQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJEhpdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgYnVpbGQgZGF0ZSBzdGluZwogICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gIiRUaW1lU3RhcnR7U3RhcnRZZWFyfS0kVGltZVN0YXJ0e1N0YXJ0TW9udGh9LSRUaW1lU3RhcnR7U3RhcnREYXl9ICIuCiAgICAgICAgICAgICIkVGltZVN0YXJ0e1N0YXJ0SG91cn06JFRpbWVTdGFydHtTdGFydE1pbnV0ZX06MDAiOwogICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICIkVGltZUVuZHtFbmRZZWFyfS0kVGltZUVuZHtFbmRNb250aH0tJFRpbWVFbmR7RW5kRGF5fSAiLgogICAgICAgICAgICAiJFRpbWVFbmR7RW5kSG91cn06JFRpbWVFbmR7RW5kTWludXRlfTowMCI7CiAgICAgICAgJEdldFBhcmFte1NlcXVlbmNlRW5kVGltZX0gPSAiJFRpbWVTZXF1ZW5jZUVuZHtTZXF1ZW5jZUVuZFllYXJ9LSRUaW1lU2VxdWVuY2VFbmR7U2VxdWVuY2VFbmRNb250aH0tJFRpbWVTZXF1ZW5jZUVuZHtTZXF1ZW5jZUVuZERheX0gIi4KICAgICAgICAgICAgIiRUaW1lU2VxdWVuY2VFbmR7U2VxdWVuY2VFbmRIb3VyfTokVGltZVNlcXVlbmNlRW5ke1NlcXVlbmNlRW5kTWludXRlfTowMCI7CiAgICAgICAgIyB1cGRhdGUgZXZlbnQKICAgICAgICBpZiAoJFNlbGYtPntDYWxlbmRhck9iamVjdH0tPkV2ZW50VXBkYXRlKCVHZXRQYXJhbSwgT3JnYW5pemVySUQgPT4gJFNlbGYtPntVc2VySUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBlcnJvciBzY3JlZW4KICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZSBldmVudAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2FuY2VsJykgewogICAgICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgICAgIGZvcmVhY2ggKHF3KEV2ZW50SUQpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KICAgICAgICBteSAlRXZlbnQgPSAkU2VsZi0+e0NhbGVuZGFyT2JqZWN0fS0+RXZlbnRHZXQoJUdldFBhcmFtLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhbmNlbCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUV2ZW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdDYW5jZWwnKTsKICAgICAgICAjIGJ1aWxkIE5hdmlnYXRpb25CYXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRDYWxlbmRhcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUV2ZW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgZXZlbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhbmNlbEFjdGlvbicpIHsKICAgICAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgICAgICBmb3JlYWNoIChxdyhFdmVudElEKSkgewogICAgICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICB9CiAgICAgICAgIyBkZWxldGUgZXZlbnQKICAgICAgICBpZiAoJEdldFBhcmFte0V2ZW50SUR9KSB7CiAgICAgICAgICAgIGlmICgkU2VsZi0+e0NhbGVuZGFyT2JqZWN0fS0+RXZlbnRDYW5jZWwoJUdldFBhcmFtLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICMgZXJyb3Igc2NyZWVuCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAjIGVycm9yIHNjcmVlbgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05lZWQgRXZlbnRJRCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzaG93IG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICBpZiAoISRTZWxmLT57UHJpbnR9KSB7CiAgICAgICAgIyBzdGFydCB3aXRoIHBhZ2UgaGVhZGVyCiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdPdmVydmlldycpOwogICAgICAgICMgYnVpbGQgTmF2aWdhdGlvbkJhcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEhlYWRlcigpOwogICAgfQogICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4geyB9LAogICAgKTsKICAgIGlmICghJFNlbGYtPntQcmludH0pIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld01lbnUnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgfQogICAgbXkgJFJlcXVlc3RlZFVSTCA9ICRTZWxmLT57UmVxdWVzdGVkVVJMfTsKICAgICRSZXF1ZXN0ZWRVUkwgPX4gcy9cJk1lbWJlcnM9KE15fEFsbCkvL2c7CiAgICAkUmVxdWVzdGVkVVJMID1+IHMvTWVtYmVycz0oTXl8QWxsKS8vZzsKICAgIGlmICgkU2VsZi0+e01lbWJlcnN9IGVxICdBbGwnKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdNZW51TXknLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFJlcXVlc3RlZFVSTCA9PiAkUmVxdWVzdGVkVVJMLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld01lbnVBbGwnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFJlcXVlc3RlZFVSTCA9PiAkUmVxdWVzdGVkVVJMLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoJFNlbGYtPntWaWV3fSBlcSAnV2VlazUnKSB7CiAgICAgICAgIyBuYXZiYXIKICAgICAgICBteSAoJE5leHRZZWFyLCROZXh0TW9udGgsJE5leHREYXkpID0gQWRkX0RlbHRhX0RheXMoJFNlbGYtPntZZWFyfSwkU2VsZi0+e01vbnRofSwkU2VsZi0+e0RheX0sIDcpOwogICAgICAgIG15ICgkTGFzdFllYXIsJExhc3RNb250aCwkTGFzdERheSkgPSBBZGRfRGVsdGFfRGF5cygkU2VsZi0+e1llYXJ9LCRTZWxmLT57TW9udGh9LCRTZWxmLT57RGF5fSwgIi03Iik7CiAgICAgICAgaWYgKCEkU2VsZi0+e1ByaW50fSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGFzdFllYXIgPT4gJExhc3RZZWFyLAogICAgICAgICAgICAgICAgICAgIExhc3RNb250aCA9PiAkTGFzdE1vbnRoLAogICAgICAgICAgICAgICAgICAgIExhc3REYXkgPT4gJExhc3REYXksCiAgICAgICAgICAgICAgICAgICAgTmV4dFllYXIgPT4gJE5leHRZZWFyLAogICAgICAgICAgICAgICAgICAgIE5leHRNb250aCA9PiAkTmV4dE1vbnRoLAogICAgICAgICAgICAgICAgICAgIE5leHREYXkgPT4gJE5leHREYXksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIHNob3cgZGF5cwogICAgICAgIG15ICREb3cgPSBEYXlfb2ZfV2VlaygkU2VsZi0+e1llYXJ9LCRTZWxmLT57TW9udGh9LCRTZWxmLT57RGF5fSk7CiAgICAgICAgZm9yZWFjaCAoMS4uNSkgewogICAgICAgICAgICBteSAoJFllYXIsJE1vbnRoLCREYXkpID0gQWRkX0RlbHRhX0RheXMoJFNlbGYtPntZZWFyfSwkU2VsZi0+e01vbnRofSwkU2VsZi0+e0RheX0sICgkXy0kRG93KSk7CiAgICAgICAgICAgICRTZWxmLT5DYWxlbmRhclZpZXdEYXkoJFllYXIsJE1vbnRoLCREYXkpOwogICAgICAgIH0KICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50Q2FsZW5kYXInLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCRTZWxmLT57Vmlld30gZXEgJ1dlZWs3JykgewogICAgICAgICMgbmF2YmFyCiAgICAgICAgbXkgKCROZXh0WWVhciwkTmV4dE1vbnRoLCROZXh0RGF5KSA9IEFkZF9EZWx0YV9EYXlzKCRTZWxmLT57WWVhcn0sJFNlbGYtPntNb250aH0sJFNlbGYtPntEYXl9LCA3KTsKICAgICAgICBteSAoJExhc3RZZWFyLCRMYXN0TW9udGgsJExhc3REYXkpID0gQWRkX0RlbHRhX0RheXMoJFNlbGYtPntZZWFyfSwkU2VsZi0+e01vbnRofSwkU2VsZi0+e0RheX0sICItNyIpOwogICAgICAgIGlmICghJFNlbGYtPntQcmludH0pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhc3RZZWFyID0+ICRMYXN0WWVhciwKICAgICAgICAgICAgICAgICAgICBMYXN0TW9udGggPT4gJExhc3RNb250aCwKICAgICAgICAgICAgICAgICAgICBMYXN0RGF5ID0+ICRMYXN0RGF5LAogICAgICAgICAgICAgICAgICAgIE5leHRZZWFyID0+ICROZXh0WWVhciwKICAgICAgICAgICAgICAgICAgICBOZXh0TW9udGggPT4gJE5leHRNb250aCwKICAgICAgICAgICAgICAgICAgICBOZXh0RGF5ID0+ICROZXh0RGF5LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgIyBzaG93IGRheXMKICAgICAgICBteSAkRG93ID0gRGF5X29mX1dlZWsoJFNlbGYtPntZZWFyfSwkU2VsZi0+e01vbnRofSwkU2VsZi0+e0RheX0pOwogICAgICAgIGZvcmVhY2ggKDEuLjcpIHsKICAgICAgICAgICAgbXkgKCRZZWFyLCRNb250aCwkRGF5KSA9IEFkZF9EZWx0YV9EYXlzKCRTZWxmLT57WWVhcn0sJFNlbGYtPntNb250aH0sJFNlbGYtPntEYXl9LCAoJF8tJERvdykpOwogICAgICAgICAgICAkU2VsZi0+Q2FsZW5kYXJWaWV3RGF5KCRZZWFyLCRNb250aCwkRGF5KTsKICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudENhbGVuZGFyJywKICAgICAgICAgICAgRGF0YSA9PiB7IH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgaGFuZGxlIHRoZSBvbmUgbW9udGggYmFjayBjYWxlbmRhciBkYXRhLgogICAgICAgIG15ICRNb250aExhc3QgPSAkU2VsZi0+e01vbnRofSAtMTsKICAgICAgICBteSAkWWVhckxhc3QgPSAkU2VsZi0+e1llYXJ9OwogICAgICAgIGlmICgkTW9udGhMYXN0IGVxIDApIHsKICAgICAgICAgICAgJE1vbnRoTGFzdCA9IDEyOwogICAgICAgICAgICAkWWVhckxhc3QgPSAkU2VsZi0+e1llYXJ9LTE7CiAgICAgICAgfQogICAgICAgICMgaGFuZGxlIHRoZSBtaWRkbGUgY2FsZW5kYXIgZGF0YS4KICAgICAgICBteSAkTW9udGhOZXh0ID0gJFNlbGYtPntNb250aH0gKzE7CiAgICAgICAgbXkgJFllYXJOZXh0ID0gJFNlbGYtPntZZWFyfTsKICAgICAgICBpZiAoJE1vbnRoTmV4dCBlcSAxMykgewogICAgICAgICAgICAkTW9udGhOZXh0ID0gMTsKICAgICAgICAgICAgJFllYXJOZXh0ID0gJFNlbGYtPntZZWFyfSsxOwogICAgICAgIH0KICAgICAgICAjIGhhbmRlbCB0aGUgcmlndGggY2FsZW5kYXIgZGF0YS4KICAgICAgICBteSAkTW9udGhOZXh0TmV4dCA9ICRTZWxmLT57TW9udGh9ICsyOwogICAgICAgIG15ICRZZWFyTmV4dE5leHQgPSAkU2VsZi0+e1llYXJ9OwogICAgICAgIGlmICgkTW9udGhOZXh0TmV4dCBlcSAxMykgewogICAgICAgICAgICAkTW9udGhOZXh0TmV4dCA9IDE7CiAgICAgICAgICAgICRZZWFyTmV4dE5leHQgPSAkU2VsZi0+e1llYXJ9KzE7CiAgICAgICAgfQogICAgICAgIGlmICgkTW9udGhOZXh0TmV4dCBlcSAxNCkgewogICAgICAgICAgICAkTW9udGhOZXh0TmV4dCA9IDI7CiAgICAgICAgICAgICRZZWFyTmV4dE5leHQgPSAkU2VsZi0+e1llYXJ9KzE7CiAgICAgICAgfQogICAgICAgICMgbmF2YmFyCiAgICAgICAgaWYgKCEkU2VsZi0+e1ByaW50fSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGFzdFllYXIgPT4gJFllYXJMYXN0LAogICAgICAgICAgICAgICAgICAgIExhc3RNb250aCA9PiAkTW9udGhMYXN0LAogICAgICAgICAgICAgICAgICAgIE5leHRZZWFyID0+ICRZZWFyTmV4dCwKICAgICAgICAgICAgICAgICAgICBOZXh0TW9udGggPT4gJE1vbnRoTmV4dCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT5DYWxlbmRhclZpZXdNb250aCgkU2VsZi0+e1llYXJ9LCAkU2VsZi0+e01vbnRofSk7CiAgICAgICAgJFNlbGYtPkNhbGVuZGFyVmlld01vbnRoKCRZZWFyTmV4dCwgJE1vbnRoTmV4dCk7CiAgICAgICAgJFNlbGYtPkNhbGVuZGFyVmlld01vbnRoKCRZZWFyTmV4dE5leHQsICRNb250aE5leHROZXh0KTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50Q2FsZW5kYXInLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCEkU2VsZi0+e1ByaW50fSkgewogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwogICAgfQogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBDYWxlbmRhclZpZXdNb250aCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJFllYXIgPSBzaGlmdDsKICAgIG15ICRNb250aCA9IHNoaWZ0OwogICAgbXkgJE1vbnRoU3RyaW5nID0gTW9udGhfdG9fVGV4dCgkTW9udGgpOwogICAgIyBzdGFydCBvZiB0YWJsZS4KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTW9udGgnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBNb250aFN0cmluZyA9PiAkTW9udGhTdHJpbmcsCiAgICAgICAgICAgIFllYXIgPT4gJFllYXIsCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkT3V0cHV0ID0gJyc7CiAgICAjIGRheXMgcGVyIG1vbnRoLgogICAgbXkgJERheXMgPSBEYXlzX2luX01vbnRoKCRZZWFyLCRNb250aCk7CiAgICBmb3JlYWNoIG15ICREYXkgKDEuLiREYXlzKSB7CiAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+X0V2ZW50UHJlZmVyZW5jZXMoJFllYXIsJE1vbnRoLCREYXksMCwwLCRZZWFyLCRNb250aCwkRGF5LDIzLDU5KTsKICAgICAgICBteSAkRG93ID0gRGF5X29mX1dlZWsoJFllYXIsJE1vbnRoLCREYXkpOwogICAgICAgIG15ICREYXlTdHJpbmcgPSBEYXlfb2ZfV2Vla19BYmJyZXZpYXRpb24oJERvdyk7CiAgICAgICAgIyAkT3V0cHV0IC49IHRoZSByZXN1bHQgb2YgeCBkYXkuCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTW9udGhEYXknLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgWWVhciA9PiAkWWVhciwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICAgICAgICAgIERheSA9PiAkRGF5LAogICAgICAgICAgICAgICAgRGF5U3RyaW5nID0+ICREYXlTdHJpbmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkTm90aW5nID0gMTsKICAgICAgICAjIGNyZWF0ZSBjbGFuZGFyIHdlZWsgb2YgeWVhci4KICAgICAgICBpZiAoJERvdyBlcSAxKSB7CiAgICAgICAgICAgICROb3RpbmcgPSAwOwogICAgICAgICAgICBteSAoJENhbGVuZGFyV2VlaywgJENhbGVuZGFyWWVhcikgPSBXZWVrX29mX1llYXIoJFllYXIsJE1vbnRoLCREYXkpOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTW9udGhXZWVrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgIyBzaG93IGRheSBpbmZvCiAgICAgICAgaWYgKCREYXRhe0NGREV9KSB7CiAgICAgICAgICAgICROb3RpbmcgPSAwOwogICAgICAgICAgICBmb3JlYWNoIChAeyREYXRhe0NGREV9fSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNb250aE5vdGljZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoQHskRGF0YXtFdmVudElEc319KSB7CiAgICAgICAgICAgICROb3RpbmcgPSAwOwogICAgICAgICAgICBteSAlRXZlbnQgPSAleyRffTsKICAgICAgICAgICAgbXkgJUV2ZW50T3JpZyA9ICRTZWxmLT57Q2FsZW5kYXJPYmplY3R9LT5FdmVudEdldCgKICAgICAgICAgICAgICAgIEV2ZW50SUQgPT4gJEV2ZW50e0V2ZW50SUR9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFByZWZmaXggPSAnJzsKICAgICAgICAgICAgZm9yZWFjaCBteSAkUGFydGljaXBhbnRJRCAoQHskRXZlbnRPcmlne1BhcnRpY2lwYW50SURzfX0pIHsKICAgICAgICAgICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJ0aWNpcGFudElELAogICAgICAgICAgICAgICAgICAgIENhY2hlID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRQcmVmZml4KSB7CiAgICAgICAgICAgICAgICAgICAgJFByZWZmaXggLj0gJywnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFByZWZmaXggLj0gJFVzZXJ7VXNlckxvZ2lufTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFByZWZmaXgpIHsKICAgICAgICAgICAgICAgICRFdmVudHtUaXRsZX0gPSAnKCcuJFByZWZmaXguJykgJy4kRXZlbnR7VGl0bGV9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkRXZlbnR7U3RhdGV9ID1+IC9wcml2YXRlL2kgJiYgJEV2ZW50e09yZ2FuaXplcklEfSBuZSAkU2VsZi0+e1VzZXJJRH0pIHsKICAgICAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoQHskRXZlbnRPcmlne1BhcnRpY2lwYW50SURzfX0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJF8gZXEgJFNlbGYtPntVc2VySUR9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRIaXQgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJEhpdCkgewogICAgICAgICAgICAgICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRXZlbnR7T3JnYW5pemVySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTW9udGhFdmVudFByaXZhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJUV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNb250aEV2ZW50UHVibGljJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTW9udGhFdmVudFB1YmxpYycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVFdmVudCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGhhbmRsZSBhIGVtdHkgY2VsbCAobm8gZXZlbnQpLgogICAgICAgIGlmICgkTm90aW5nKSB7CiAgICAgICAgICAgICROb3RpbmcgPSAwOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTW9udGhJbmZvJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJy0nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgQ2FsZW5kYXJWaWV3RGF5IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkWWVhciA9IHNoaWZ0OwogICAgbXkgJE1vbnRoID0gc2hpZnQ7CiAgICBteSAkRGF5ID0gc2hpZnQ7CiAgICBteSAkTW9udGhTdHJpbmcgPSBNb250aF90b19UZXh0KCRNb250aCk7CiAgICBteSAkRG93ID0gRGF5X29mX1dlZWsoJFllYXIsJE1vbnRoLCREYXkpOwogICAgbXkgJERheVN0cmluZyA9IERheV9vZl9XZWVrX0FiYnJldmlhdGlvbigkRG93KTsKICAgIG15ICRXaWR0aCA9IDA7CiAgICBpZiAoJFNlbGYtPntWaWV3fSBlcSAnV2VlazcnKSB7CiAgICAgICAgJFdpZHRoID0gaW50KDEwMC83KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRXaWR0aCA9IGludCgxMDAvNSk7CiAgICB9CiAgICAjIHN0YXJ0IG9mIHRhYmxlLgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEYXknLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBNb250aFN0cmluZyA9PiAkTW9udGhTdHJpbmcsCiAgICAgICAgICAgIERheVN0cmluZyA9PiAkRGF5U3RyaW5nLAogICAgICAgICAgICBEYXkgPT4gJERheSwKICAgICAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgICAgICBZZWFyID0+ICRZZWFyLAogICAgICAgICAgICBXaWR0aCA9PiAkV2lkdGgsCiAgICAgICAgfSwKICAgICk7CiAgICBteSAoJFN0YXJ0WWVhciwkU3RhcnRNb250aCwkU3RhcnREYXkpID0gQWRkX0RlbHRhX0RheXMoJFllYXIsJE1vbnRoLCREYXksICItJERvdyIpOwogICAgbXkgJE91dHB1dCA9ICcnOwogICAgIyBzaG93IGVhY2ggd2VlayBkYXkKICAgIGZvcmVhY2ggbXkgJEhvdXIgKDAuLjIzKSB7CiAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+X0V2ZW50UHJlZmVyZW5jZXMoJFllYXIsJE1vbnRoLCREYXksJEhvdXIsMCwkWWVhciwkTW9udGgsJERheSwkSG91ciw1OSk7CiAgICAgICAgIyAkT3V0cHV0IC49IHRoZSByZXN1bHQgb2YgeCBkYXkuCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGF5SG91cicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICBZZWFyID0+ICRZZWFyLAogICAgICAgICAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgRGF5ID0+ICREYXksCiAgICAgICAgICAgICAgICBIb3VyID0+ICRIb3VyLAogICAgICAgICAgICAgICAgTWludXRlID0+ICcwJywKICAgICAgICAgICAgICAgIERheVN0cmluZyA9PiAkRGF5U3RyaW5nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJE5vdGluZyA9IDE7CiAgICAgICAgIyBjcmVhdGUgY2xhbmRhciB3ZWVrIG9mIHllYXIuCiAgICAgICAgaWYgKCREb3cgZXEgMSAmJiAkSG91ciA9PSAwKSB7CiAgICAgICAgICAgICROb3RpbmcgPSAwOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF5V2VlaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgc2hvdyBkYXkgaW5mbwogICAgICAgIGlmICgkRGF0YXtDRkRFfSkgewogICAgICAgICAgICAkTm90aW5nID0gMDsKICAgICAgICAgICAgZm9yZWFjaCAoQHskRGF0YXtDRkRFfX0pIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF5Tm90aWNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkXywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3JlYWNoIChAeyREYXRhe0V2ZW50SURzfX0pIHsKICAgICAgICAgICAgJE5vdGluZyA9IDA7CiAgICAgICAgICAgIG15ICVFdmVudCA9ICV7JF99OwogICAgICAgICAgICBteSAlRXZlbnRPcmlnID0gJFNlbGYtPntDYWxlbmRhck9iamVjdH0tPkV2ZW50R2V0KAogICAgICAgICAgICAgICAgRXZlbnRJRCA9PiAkRXZlbnR7RXZlbnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkUHJlZmZpeCA9ICcnOwogICAgICAgICAgICBmb3JlYWNoIG15ICRQYXJ0aWNpcGFudElEIChAeyRFdmVudE9yaWd7UGFydGljaXBhbnRJRHN9fSkgewogICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcnRpY2lwYW50SUQsCiAgICAgICAgICAgICAgICAgICAgQ2FjaGUgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJFByZWZmaXgpIHsKICAgICAgICAgICAgICAgICAgICAkUHJlZmZpeCAuPSAnLCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkUHJlZmZpeCAuPSAkVXNlcntVc2VyTG9naW59OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkUHJlZmZpeCkgewogICAgICAgICAgICAgICAgJEV2ZW50e1RpdGxlfSA9ICcoJy4kUHJlZmZpeC4nKSAnLiRFdmVudHtUaXRsZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRFdmVudHtTdGF0ZX0gPX4gL3ByaXZhdGUvaSAmJiAkRXZlbnR7T3JnYW5pemVySUR9IG5lICRTZWxmLT57VXNlcklEfSkgewogICAgICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgICAgICBmb3JlYWNoIChAeyRFdmVudE9yaWd7UGFydGljaXBhbnRJRHN9fSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkXyBlcSAkU2VsZi0+e1VzZXJJRH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkSGl0KSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRFdmVudHtPcmdhbml6ZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdEYXlFdmVudFByaXZhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJUV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdEYXlFdmVudFB1YmxpYycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJUV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0RheUV2ZW50UHVibGljJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUV2ZW50LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgaGFuZGxlIGEgZW10eSBjZWxsIChubyBldmVudCkuCiAgICAgICAgaWYgKCROb3RpbmcpIHsKICAgICAgICAgICAgJE5vdGluZyA9IDA7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEYXlJbmZvJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJy0nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgX0V2ZW50UHJlZmVyZW5jZXMgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRTdGFydFllYXIgPSBzaGlmdDsKICAgIG15ICRTdGFydE1vbnRoID0gc3ByaW50ZigiJTAyZCIsc2hpZnQpOwogICAgbXkgJFN0YXJ0RGF5ID0gc3ByaW50ZigiJTAyZCIsc2hpZnQpOwogICAgbXkgJFN0YXJ0SG91ciA9IHNoaWZ0OwogICAgbXkgJFN0YXJ0TWludXRlID0gc2hpZnQ7CiAgICBteSAkRW5kWWVhciA9IHNoaWZ0OwogICAgbXkgJEVuZE1vbnRoID0gc3ByaW50ZigiJTAyZCIsc2hpZnQpOwogICAgbXkgJEVuZERheSA9IHNwcmludGYoIiUwMmQiLHNoaWZ0KTsKICAgIG15ICRFbmRIb3VyID0gc2hpZnQ7CiAgICBteSAkRW5kTWludXRlID0gc2hpZnQ7CgogICAgbXkgKCRTZWMsICRNaW4sICRIb3VyLCAkVERheSwgJFRNb250aCwgJFRZZWFyKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CiAgICBteSAoJENhbGVuZGFyV2VlaywgJENhbGVuZGFyWWVhcikgPSBXZWVrX29mX1llYXIoJFN0YXJ0WWVhciwkU3RhcnRNb250aCwkU3RhcnREYXkpOwogICAgbXkgQENGRE4gPSBAeyRTZWxmLT57Q0ZETn19OwogICAgbXkgQENGRCA9IEB7JFNlbGYtPntDRkR9fTsKICAgIG15ICRNb250aFN0cmluZyA9IE1vbnRoX3RvX1RleHQoJFN0YXJ0TW9udGgpOwogICAgbXkgJERvdyA9IERheV9vZl9XZWVrKCRTdGFydFllYXIsJFN0YXJ0TW9udGgsJFN0YXJ0RGF5KTsKICAgIG15ICREYXlTdHJpbmcgPSBEYXlfb2ZfV2Vla19BYmJyZXZpYXRpb24oJERvdyk7CiAgICBteSBAVXNlcklEcyA9ICgpOwogICAgaWYgKCRTZWxmLT57TWVtYmVyc30gZXEgJ0FsbCcpIHsKICAgICAgICBAVXNlcklEcyA9ICgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFVzZXJJRHMgPSAoJFNlbGYtPntVc2VySUR9KTsKICAgIH0KICAgIG15IEBFdmVudElEcyA9ICRTZWxmLT57Q2FsZW5kYXJPYmplY3R9LT5FdmVudHMoCiAgICAgICAgU3RhcnRUaW1lID0+ICIkU3RhcnRZZWFyLSRTdGFydE1vbnRoLSRTdGFydERheSAkU3RhcnRIb3VyOiRTdGFydE1pbnV0ZTowMCIsCiAgICAgICAgRW5kVGltZSA9PiAiJEVuZFllYXItJEVuZE1vbnRoLSRFbmREYXkgJEVuZEhvdXI6JEVuZE1pbnV0ZTo1OSIsCiAgICAgICAgVXNlcklEcyA9PiBcQFVzZXJJRHMsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAjIGhhbmRsZSB0aGUgY2ZkYHMKICAgIG15IEBDRkRFID0gKCk7CiAgICBteSAkVG1wVmFyID0gMDsKICAgIGZvcmVhY2ggKEBDRkROKSB7CiAgICAgICAgbXkgKCRDWWVhciwkQ01vbnRoLCRDRGF5KSA9IEFkZF9EZWx0YV9EYXlzKEVhc3Rlcl9TdW5kYXkoJFN0YXJ0WWVhciksICRTdGFydERheSk7CiAgICAgICAgaWYgKCIkQ1llYXIsJENNb250aCwkQ0RheSIgZXEgIiRTdGFydFllYXIsJFN0YXJ0TW9udGgsJFN0YXJ0RGF5IikgewogICAgICAgICAgICBwdXNoIChAQ0ZERSwgJENGRFskVG1wVmFyXSk7CiAgICAgICAgfQogICAgICAgICRUbXBWYXIrKzsKICAgIH0KICAgICMgaGFuZGVsIHRoZSAxc3QgbWF5ISEhCiAgICBteSAkVGltZVZhY2F0aW9uRGF5cyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lVmFjYXRpb25EYXlzJyk7CiAgICBteSAkVGltZVZhY2F0aW9uRGF5c09uZVRpbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZVZhY2F0aW9uRGF5c09uZVRpbWUnKTsKICAgIGlmICgkVGltZVZhY2F0aW9uRGF5cy0+e2ludCgkU3RhcnRNb250aCl9LT57aW50KCRTdGFydERheSl9KSB7CiAgICAgICAgcHVzaCAoQENGREUsICRUaW1lVmFjYXRpb25EYXlzLT57aW50KCRTdGFydE1vbnRoKX0tPntpbnQoJFN0YXJ0RGF5KX0pOwogICAgfQogICAgaWYgKCRUaW1lVmFjYXRpb25EYXlzT25lVGltZS0+e2ludCgkU3RhcnRZZWFyKX0tPntpbnQoJFN0YXJ0TW9udGgpfS0+e2ludCgkU3RhcnREYXkpfSkgewogICAgICAgIHB1c2ggKEBDRkRFLCAkVGltZVZhY2F0aW9uRGF5c09uZVRpbWUtPntpbnQoJFN0YXJ0WWVhcil9LT57aW50KCRTdGFydE1vbnRoKX0tPntpbnQoJFN0YXJ0RGF5KX0pOwogICAgfQogICAgIyBoYW5kbGUgdGhlIHNhdCwgc3VuLCBjZmQgYW5kIHRvZGF5LgogICAgbXkgJENvdW50ZWRUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+V29ya2luZ1RpbWUoCiAgICAgICAgU3RhcnRUaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICAgICAgWWVhciA9PiAkU3RhcnRZZWFyLAogICAgICAgICAgICBNb250aCA9PiAkU3RhcnRNb250aCwKICAgICAgICAgICAgRGF5ID0+ICRTdGFydERheSwKICAgICAgICAgICAgSG91ciA9PiAkU3RhcnRIb3VyLAogICAgICAgICAgICBNaW51dGUgPT4gJFN0YXJ0TWludXRlLAogICAgICAgICAgICBTZWNvbmQgPT4gMCwKICAgICAgICApLAogICAgICAgIFN0b3BUaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICAgICAgWWVhciA9PiAkRW5kWWVhciwKICAgICAgICAgICAgTW9udGggPT4gJEVuZE1vbnRoLAogICAgICAgICAgICBEYXkgPT4gJEVuZERheSwKICAgICAgICAgICAgSG91ciA9PiAkRW5kSG91ciwKICAgICAgICAgICAgTWludXRlID0+ICRFbmRNaW51dGUsCiAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICksCiAgICApOwoKICAgIG15ICRDbGFzczsKICAgIGlmICgkQ291bnRlZFRpbWUpIHsKICAgICAgICBpZiAoJFREYXkgPT0gJFN0YXJ0RGF5ICYmICRUTW9udGggPT0gJFN0YXJ0TW9udGggJiYgJFRZZWFyID09ICRTdGFydFllYXIpIHsKICAgICAgICAgICAgJENsYXNzID0idG9kYXkiOwogICAgICAgIH0KICAgICAgICAjIGhpdCBzYXQgb3Igc3VuLgogICAgICAgIGVsc2lmICgkRG93IGVxIDYpIHsKICAgICAgICAgICAgJENsYXNzID0ic2F0dXJkYXkiOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJERvdyBlcSA3KSB7CiAgICAgICAgICAgICRDbGFzcyA9InN1bmRheSI7CiAgICAgICAgfQogICAgICAgICMgaGl0IENGRC4KICAgICAgICBlbHNpZiAoQENGREUpIHsKICAgICAgICAgICAgJENsYXNzID0iaG9saWRheSI7CiAgICAgICAgfQogICAgICAgIGVsc2lmIChARXZlbnRJRHMpIHsKIyAgICAgICAgICAgICRDbGFzcyA9ImV2ZW50IjsKICAgICAgICAgICAgJENsYXNzID0id2Vla2RheSI7CiAgICAgICAgfQogICAgICAgICMgZWxzZSBzdGQgY29sb3IuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDbGFzcyA9IndlZWtkYXkiOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICgkVERheSA9PSAkU3RhcnREYXkgJiYgJFRNb250aCA9PSAkU3RhcnRNb250aCAmJiAkVFllYXIgPT0gJFN0YXJ0WWVhcikgewogICAgICAgICAgICAkQ2xhc3MgPSJ0b2RheW5vdGNvdW50ZWQiOwogICAgICAgIH0KICAgICAgICAjIGhpdCBzYXQgb3Igc3VuLgogICAgICAgIGVsc2lmICgkRG93IGVxIDYpIHsKICAgICAgICAgICAgJENsYXNzID0ic2F0dXJkYXkiOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJERvdyBlcSA3KSB7CiAgICAgICAgICAgICRDbGFzcyA9InN1bmRheSI7CiAgICAgICAgfQogICAgICAgICMgaGl0IENGRC4KICAgICAgICBlbHNpZiAoQENGREUpIHsKICAgICAgICAgICAgJENsYXNzID0iaG9saWRheSI7CiAgICAgICAgfQogICAgICAgIGVsc2lmIChARXZlbnRJRHMpIHsKIyAgICAgICAgICAgICRDbGFzcyA9ImV2ZW50bm90Y291bnRlZCI7CiAgICAgICAgICAgICRDbGFzcyA9IndlZWtkYXlub3Rjb3VudGVkIjsKICAgICAgICB9CiAgICAgICAgIyBlbHNlIHN0ZCBjb2xvci4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENsYXNzID0id2Vla2RheW5vdGNvdW50ZWQiOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIENhbGVuZGFyV2VlayA9PiAkQ2FsZW5kYXJXZWVrLAogICAgICAgIENGREUgPT4gXEBDRkRFLAogICAgICAgIEV2ZW50SURzID0+IFxARXZlbnRJRHMsCiAgICApOwp9CgoxOwo= IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BZ2VudENhbGVuZGFyLnBtIC0gdGhlIGRlIGxhbmd1YWdlIGZvciBBZ2VudENhbGVuZGFyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9BZ2VudENhbGVuZGFyLnBtLHYgMS45IDIwMDgvMDMvMjEgMDI6MTI6NTYgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfQWdlbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJFRyYW5zbGF0aW9uID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkVHJhbnNsYXRpb24gbmUgJ0hBU0gnOwoKICAgICRUcmFuc2xhdGlvbi0+eydDVyd9ID0gJ0tXJzsKICAgICRUcmFuc2xhdGlvbi0+eydUb2RheSd9ID0gJ0hldXRlJzsKICAgICRUcmFuc2xhdGlvbi0+eydUb21vcnJvdyd9ID0gJ01vcmdlbic7CiAgICAkVHJhbnNsYXRpb24tPnsnUnVubmluZyd9ID0gJ0xhdWZlbic7CiAgICAkVHJhbnNsYXRpb24tPnsnRmVhc3Qgb2YgQ29ycHVzIENocmlzdGknfSA9ICcnOwogICAgJFRyYW5zbGF0aW9uLT57J1doaXRzdW5kYXknfSA9ICcnOwogICAgJFRyYW5zbGF0aW9uLT57J1doaXRtb25kYXknfSA9ICcnOwogICAgJFRyYW5zbGF0aW9uLT57J0FzY2Vuc2lvbiBvZiBDaHJpc3QnfSA9ICcnOwogICAgJFRyYW5zbGF0aW9uLT57JzEgU3QuIE1heSd9ID0gJ0Vyc3RlciBNYWknOwogICAgJFRyYW5zbGF0aW9uLT57J0NocmlzdG1hcyd9ID0gJ1dlaWhuYWNodGVuJzsKICAgICRUcmFuc2xhdGlvbi0+eydGaXJzdCBDaHJpc3RtYXMgRGF5J30gPSAnRXJzdGVyIFdlaWhuYWNodHN0YWcnOwogICAgJFRyYW5zbGF0aW9uLT57J1NlY29uZCBDaHJpc3RtYXMgRGF5J30gPSAnWndlaXRlciBXZWlobmFjaHRzdGFnJzsKICAgICRUcmFuc2xhdGlvbi0+eydTaWx2ZXN0ZXInfSA9ICdTaWx2ZXN0ZXInOwogICAgJFRyYW5zbGF0aW9uLT57J05ldyBZZWFyXCdzIEV2ZSEnfSA9ICdOZXUgSmFociEnOwogICAgJFRyYW5zbGF0aW9uLT57J0phbnVhcnknfSA9ICdKYW51YXInOwogICAgJFRyYW5zbGF0aW9uLT57J0ZlYnJ1YXJ5J30gPSAnRmVicnVhcic7CiAgICAkVHJhbnNsYXRpb24tPnsnTWFyY2gnfSA9ICdN5HJ6JzsKICAgICRUcmFuc2xhdGlvbi0+eydBcHJpbCd9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnSnVuZSd9ID0gJ0p1bmknOwogICAgJFRyYW5zbGF0aW9uLT57J0p1bHknfSA9ICdKdWxpJzsKICAgICRUcmFuc2xhdGlvbi0+eydBdWd1c3QnfSA9ICcnOwogICAgJFRyYW5zbGF0aW9uLT57J1NlcHRlbWJlcid9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnT2N0b2Jlcid9ID0gJ09rdG9iZXInOwogICAgJFRyYW5zbGF0aW9uLT57J05vdmVtYmVyJ30gPSAnJzsKICAgICRUcmFuc2xhdGlvbi0+eydEZWNlbWJlcid9ID0gJ0RlemVtYmVyJzsKICAgICRUcmFuc2xhdGlvbi0+eyc1IERheSd9ID0gJzUgVGFnZSc7CiAgICAkVHJhbnNsYXRpb24tPnsnNyBEYXknfSA9ICc3IFRhZ2UnOwogICAgJFRyYW5zbGF0aW9uLT57JzMgTW9udGgnfSA9ICczIE1vbmF0ZSc7CiAgICAkVHJhbnNsYXRpb24tPnsncHVibGljJ30gPSAn1mZmZW50bGljaCc7CiAgICAkVHJhbnNsYXRpb24tPnsncHJpdmF0ZSd9ID0gJ1ByaXZhdCc7CiAgICAkVHJhbnNsYXRpb24tPnsndmFjYXRpb24nfSA9ICdGcmVpemVpdCc7CiAgICAkVHJhbnNsYXRpb24tPnsnbWVldGluZyd9ID0gJ01lZXRpbmcnOwogICAgJFRyYW5zbGF0aW9uLT57J05ldyBFdmVudC4uLid9ID0gJ05ldSAuLi4nOwogICAgJFRyYW5zbGF0aW9uLT57J1BhcnRpY2lwYW50J30gPSAnVGVpbG5laG1lcic7CiAgICAkVHJhbnNsYXRpb24tPnsnSW52b2x2ZWQnfSA9ICdJbnZvbHZpZXJ0JzsKICAgICRUcmFuc2xhdGlvbi0+eydOb25lJ30gPSAnS2VpbmUnOwogICAgJFRyYW5zbGF0aW9uLT57J1dlZWtseSd9ID0gJ1f2Y2hlbnRsaWNoJzsKICAgICRUcmFuc2xhdGlvbi0+eydNb250aGx5J30gPSAnTW9uYXRsaWNoJzsKICAgICRUcmFuc2xhdGlvbi0+eydZZWFybHknfSA9ICdK5GhybGljaCc7CiAgICAkVHJhbnNsYXRpb24tPnsnU2VxdWVuY2UnfSA9ICdTZXF1ZW56JzsKICAgICRUcmFuc2xhdGlvbi0+eydTZXF1ZW5jZSBFbmQnfSA9ICdTZXF1ZW56ZW5kZSc7CiAgICAkVHJhbnNsYXRpb24tPnsnMS4gZmlyc3QnfSA9ICcxLiBlcnN0ZW4nOwogICAgJFRyYW5zbGF0aW9uLT57JzIuIHNlY29uZCd9ID0gJzIuIHp3ZWl0ZW4nOwogICAgJFRyYW5zbGF0aW9uLT57JzMuIHRoaXJkJ30gPSAnMy4gZHJpdHRlbic7CiAgICAkVHJhbnNsYXRpb24tPnsnNC4gZm91cnRoJ30gPSAnNC4gdmllcnRlbic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9BZ2VudENhbGVuZGFyLnBtIC0gdGhlIGZyIGxhbmd1YWdlIGZvciBBZ2VudENhbGVuZGFyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmcl9BZ2VudENhbGVuZGFyLnBtLHYgMS4yIDIwMDgvMDMvMjEgMDI6MTI6NTYgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZnJfQWdlbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJFRyYW5zbGF0aW9uID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkVHJhbnNsYXRpb24gbmUgJ0hBU0gnOwoKICAgICRUcmFuc2xhdGlvbi0+eydDVyd9ID0gJ3NlbSc7CiAgICAkVHJhbnNsYXRpb24tPnsnVG9kYXknfSA9ICdBdWpvdXJkXCdodWknOwogICAgJFRyYW5zbGF0aW9uLT57J1RvbW9ycm93J30gPSAnRGVtYWluJzsKICAgICRUcmFuc2xhdGlvbi0+eydSdW5uaW5nJ30gPSAnRW4gY291cnMnOwogICAgJFRyYW5zbGF0aW9uLT57J0ZlYXN0IG9mIENvcnB1cyBDaHJpc3RpJ30gPSAnVmVuZHJlZGkgZGUgUOJxdWVzJzsKICAgICRUcmFuc2xhdGlvbi0+eydXaGl0c3VuZGF5J30gPSAnUOJxdWVzJzsKICAgICRUcmFuc2xhdGlvbi0+eydXaGl0bW9uZGF5J30gPSAnTHVuZGkgZGUgUOJxdWVzJzsKICAgICRUcmFuc2xhdGlvbi0+eydBc2NlbnNpb24gb2YgQ2hyaXN0J30gPSAnQXNjZW5zaW9uJzsKICAgICRUcmFuc2xhdGlvbi0+eycxIFN0LiBNYXknfSA9ICcxZXIgTWFpJzsKICAgICRUcmFuc2xhdGlvbi0+eydDaHJpc3RtYXMnfSA9ICdWZWlsbGUgZGUgTm/rbCc7CiAgICAkVHJhbnNsYXRpb24tPnsnRmlyc3QgQ2hyaXN0bWFzIERheSd9ID0gJ0pvdXIgZGUgTvZlbCc7CiAgICAkVHJhbnNsYXRpb24tPnsnU2Vjb25kIENocmlzdG1hcyBEYXknfSA9ICdMZW5kZW1haW4gZGUgTm/rbCc7CiAgICAkVHJhbnNsYXRpb24tPnsnU2lsdmVzdGVyJ30gPSAnU3QgU2lsdmVzdGVyJzsKICAgICRUcmFuc2xhdGlvbi0+eydOZXcgWWVhclwncyBFdmUhJ30gPSAnTm91dmVsbGUgYW5u6WUgISc7CiAgICAkVHJhbnNsYXRpb24tPnsnSmFudWFyeSd9ID0gJ0phbnZpZXInOwogICAgJFRyYW5zbGF0aW9uLT57J0ZlYnJ1YXJ5J30gPSAnRul2cmllcic7CiAgICAkVHJhbnNsYXRpb24tPnsnTWFyY2gnfSA9ICdNYXJzJzsKICAgICRUcmFuc2xhdGlvbi0+eydBcHJpbCd9ID0gJ0F2cmlsJzsKICAgICRUcmFuc2xhdGlvbi0+eydKdW5lJ30gPSAnSnVpbic7CiAgICAkVHJhbnNsYXRpb24tPnsnSnVseSd9ID0gJ0p1aWxsZXQnOwogICAgJFRyYW5zbGF0aW9uLT57J0F1Z3VzdCd9ID0gJ0Fv+3QnOwogICAgJFRyYW5zbGF0aW9uLT57J1NlcHRlbWJlcid9ID0gJ1NlcHRlbWJyZSc7CiAgICAkVHJhbnNsYXRpb24tPnsnT2N0b2Jlcid9ID0gJ09jdG9icmUnOwogICAgJFRyYW5zbGF0aW9uLT57J05vdmVtYmVyJ30gPSAnTm92ZW1icmUnOwogICAgJFRyYW5zbGF0aW9uLT57J0RlY2VtYmVyJ30gPSAnRGVjZW1icmUnOwogICAgJFRyYW5zbGF0aW9uLT57JzUgRGF5J30gPSAnNSBqb3Vycyc7CiAgICAkVHJhbnNsYXRpb24tPnsnNyBEYXknfSA9ICc3IGpvdXJzJzsKICAgICRUcmFuc2xhdGlvbi0+eyczIE1vbnRoJ30gPSAnMyBtb2lzJzsKICAgICRUcmFuc2xhdGlvbi0+eydwdWJsaWMnfSA9ICdwdWJsaWMnOwogICAgJFRyYW5zbGF0aW9uLT57J3ByaXZhdGUnfSA9ICdQcml26Sc7CiAgICAkVHJhbnNsYXRpb24tPnsndmFjYXRpb24nfSA9ICdjb25n6XMnOwogICAgJFRyYW5zbGF0aW9uLT57J21lZXRpbmcnfSA9ICdS6XVuaW9uJzsKICAgICRUcmFuc2xhdGlvbi0+eydOZXcgRXZlbnQuLi4nfSA9ICdOb3V2ZWwg6XbpbmVtZW50IC4uLic7CiAgICAkVHJhbnNsYXRpb24tPnsnSW52b2x2ZWQnfSA9ICdDb25jZXJu6Sc7CiAgICAkVHJhbnNsYXRpb24tPnsnJ30gPSAnJzsKCiAgICByZXR1cm4gMTsKfQoxOwo= IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9BZ2VudENhbGVuZGFyLnBtIC0gdGhlIGl0IGxhbmd1YWdlIGZvciBBZ2VudENhbGVuZGFyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBpdF9BZ2VudENhbGVuZGFyLnBtLHYgMS41IDIwMDgvMDMvMjEgMDI6MTI6NTYgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aXRfQWdlbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJFRyYW5zbGF0aW9uID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkVHJhbnNsYXRpb24gbmUgJ0hBU0gnOwoKICAgICRUcmFuc2xhdGlvbi0+eydDVyd9ID0gJ1NldHRpbWFuYSc7CiAgICAkVHJhbnNsYXRpb24tPnsnVG9kYXknfSA9ICdPZ2dpJzsKICAgICRUcmFuc2xhdGlvbi0+eydUb21vcnJvdyd9ID0gJ0RvbWFuaSc7CiAgICAkVHJhbnNsYXRpb24tPnsnUnVubmluZyd9ID0gJ0luIGNvcnNvJzsKICAgICRUcmFuc2xhdGlvbi0+eydGZWFzdCBvZiBDb3JwdXMgQ2hyaXN0aSd9ID0gJ0NvcnB1cyBDaHJpc3RpJzsKICAgICRUcmFuc2xhdGlvbi0+eydXaGl0c3VuZGF5J30gPSAnJzsKICAgICRUcmFuc2xhdGlvbi0+eydXaGl0bW9uZGF5J30gPSAnJzsKICAgICRUcmFuc2xhdGlvbi0+eydBc2NlbnNpb24gb2YgQ2hyaXN0J30gPSAnQXNjZW5zaW9uZSBkaSBDcmlzdG8nOwogICAgJFRyYW5zbGF0aW9uLT57JzEgU3QuIE1heSd9ID0gJ1ByaW1vIE1hZ2dpbyc7CiAgICAkVHJhbnNsYXRpb24tPnsnQ2hyaXN0bWFzJ30gPSAnVmlnaWxpYSBkaSBOYXRhbGUnOwogICAgJFRyYW5zbGF0aW9uLT57J0ZpcnN0IENocmlzdG1hcyBEYXknfSA9ICdOYXRhbGUnOwogICAgJFRyYW5zbGF0aW9uLT57J1NlY29uZCBDaHJpc3RtYXMgRGF5J30gPSAnU2FudG8gU3RlZmFubyc7CiAgICAkVHJhbnNsYXRpb24tPnsnU2lsdmVzdGVyJ30gPSAnU2FuIFNpbHZlc3Rybyc7CiAgICAkVHJhbnNsYXRpb24tPnsnTmV3IFllYXJcJ3MgRXZlISd9ID0gJ0NhcG9kYW5ubyc7CiAgICAkVHJhbnNsYXRpb24tPnsnSmFudWFyeSd9ID0gJ0dlbm5haW8nOwogICAgJFRyYW5zbGF0aW9uLT57J0ZlYnJ1YXJ5J30gPSAnRmViYnJhaW8nOwogICAgJFRyYW5zbGF0aW9uLT57J01hcmNoJ30gPSAnTWFyem8nOwogICAgJFRyYW5zbGF0aW9uLT57J01heSd9ID0gJ01hZ2dpbyc7CiAgICAkVHJhbnNsYXRpb24tPnsnQXByaWwnfSA9ICdBcHJpbGUnOwogICAgJFRyYW5zbGF0aW9uLT57J0p1bmUnfSA9ICdHaXVnbm8nOwogICAgJFRyYW5zbGF0aW9uLT57J0p1bHknfSA9ICdMdWdsaW8nOwogICAgJFRyYW5zbGF0aW9uLT57J0F1Z3VzdCd9ID0gJ0Fnb3N0byc7CiAgICAkVHJhbnNsYXRpb24tPnsnU2VwdGVtYmVyJ30gPSAnU2V0dGVtYnJlJzsKICAgICRUcmFuc2xhdGlvbi0+eydPY3RvYmVyJ30gPSAnT3R0b2JyZSc7CiAgICAkVHJhbnNsYXRpb24tPnsnTm92ZW1iZXInfSA9ICdOb3ZlbWJyZSc7CiAgICAkVHJhbnNsYXRpb24tPnsnRGVjZW1iZXInfSA9ICdEaWNlbWJyZSc7CiAgICAkVHJhbnNsYXRpb24tPnsnNSBEYXknfSA9ICc1IEdpb3JuaSc7CiAgICAkVHJhbnNsYXRpb24tPnsnNyBEYXknfSA9ICc3IEdpb3JuaSc7CiAgICAkVHJhbnNsYXRpb24tPnsnMyBNb250aCd9ID0gJzMgTWVzaSc7CiAgICAkVHJhbnNsYXRpb24tPnsncHVibGljJ30gPSAncHViYmxpY28nOwogICAgJFRyYW5zbGF0aW9uLT57J3ByaXZhdGUnfSA9ICdwcml2YXRvJzsKICAgICRUcmFuc2xhdGlvbi0+eyd2YWNhdGlvbid9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnbWVldGluZyd9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnTmV3IEV2ZW50Li4uJ30gPSAnTnVvdm8uLi4nOwogICAgJFRyYW5zbGF0aW9uLT57J1BhcnRpY2lwYW50J30gPSAnUGFydGVjaXBhbnRlJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9uYl9OT19BZ2VudENhbGVuZGFyLnBtIC0gdGhlIG5iIGxhbmd1YWdlIGZvciBBZ2VudENhbGVuZGFyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBuYl9OT19BZ2VudENhbGVuZGFyLnBtLHYgMS41IDIwMDgvMDMvMjEgMDI6MTI6NTYgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bmJfTk9fQWdlbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJFRyYW5zbGF0aW9uID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkVHJhbnNsYXRpb24gbmUgJ0hBU0gnOwoKICAgICRUcmFuc2xhdGlvbi0+eydDVyd9ID0gJ1VrZSc7CiAgICAkVHJhbnNsYXRpb24tPnsnVG9kYXknfSA9ICdJZGFnJzsKICAgICRUcmFuc2xhdGlvbi0+eydUb21vcnJvdyd9ID0gJ0ltb3JnZW4nOwogICAgJFRyYW5zbGF0aW9uLT57J1J1bm5pbmcnfSA9ICdM+HBlbmRlJzsKICAgICRUcmFuc2xhdGlvbi0+eydGZWFzdCBvZiBDb3JwdXMgQ2hyaXN0aSd9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnV2hpdHN1bmRheSd9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnV2hpdG1vbmRheSd9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnQXNjZW5zaW9uIG9mIENocmlzdCd9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnMSBTdC4gTWF5J30gPSAnRvhyc3RlIG1haSc7CiAgICAkVHJhbnNsYXRpb24tPnsnQ2hyaXN0bWFzJ30gPSAnSnVsJzsKICAgICRUcmFuc2xhdGlvbi0+eydGaXJzdCBDaHJpc3RtYXMgRGF5J30gPSAnRvhyc3RlIGp1bGVkYWcnOwogICAgJFRyYW5zbGF0aW9uLT57J1NlY29uZCBDaHJpc3RtYXMgRGF5J30gPSAnQW5kcmUganVsZWRhZyc7CiAgICAkVHJhbnNsYXRpb24tPnsnU2lsdmVzdGVyJ30gPSAnU2lsdmVzdGVyJzsKICAgICRUcmFuc2xhdGlvbi0+eydOZXcgWWVhclwncyBFdmUhJ30gPSAnTnl0dOVyc2FmdGVuISc7CiAgICAkVHJhbnNsYXRpb24tPnsnSmFudWFyeSd9ID0gJ0phbnVhcic7CiAgICAkVHJhbnNsYXRpb24tPnsnRmVicnVhcnknfSA9ICdGZWJydWFyJzsKICAgICRUcmFuc2xhdGlvbi0+eydNYXJjaCd9ID0gJ01hcnMnOwogICAgJFRyYW5zbGF0aW9uLT57J0FwcmlsJ30gPSAnJzsKICAgICRUcmFuc2xhdGlvbi0+eydKdW5lJ30gPSAnSnVuaSc7CiAgICAkVHJhbnNsYXRpb24tPnsnSnVseSd9ID0gJ0p1bGknOwogICAgJFRyYW5zbGF0aW9uLT57J0F1Z3VzdCd9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnU2VwdGVtYmVyJ30gPSAnJzsKICAgICRUcmFuc2xhdGlvbi0+eydPY3RvYmVyJ30gPSAnT2t0b2Jlcic7CiAgICAkVHJhbnNsYXRpb24tPnsnTm92ZW1iZXInfSA9ICcnOwogICAgJFRyYW5zbGF0aW9uLT57J0RlY2VtYmVyJ30gPSAnRGVzZW1iZXInOwogICAgJFRyYW5zbGF0aW9uLT57JzUgRGF5J30gPSAnNSBkYWdlcic7CiAgICAkVHJhbnNsYXRpb24tPnsnNyBEYXknfSA9ICc3IGRhZ2VyJzsKICAgICRUcmFuc2xhdGlvbi0+eyczIE1vbnRoJ30gPSAnMyBt5W5lZGVyJzsKICAgICRUcmFuc2xhdGlvbi0+eydwdWJsaWMnfSA9ICdvZmZlbnRsaWcnOwogICAgJFRyYW5zbGF0aW9uLT57J3ByaXZhdGUnfSA9ICdwcml2YXQnOwogICAgJFRyYW5zbGF0aW9uLT57J3ZhY2F0aW9uJ30gPSAnJzsKICAgICRUcmFuc2xhdGlvbi0+eydtZWV0aW5nJ30gPSAnJzsKICAgICRUcmFuc2xhdGlvbi0+eydOZXcgRXZlbnQuLi4nfSA9ICdOeSAuLi4nOwogICAgJFRyYW5zbGF0aW9uLT57J1BhcnRpY2lwYW50J30gPSAnJzsKICAgICRUcmFuc2xhdGlvbi0+eydJbnZvbHZlZCd9ID0gJ0ludm9sdmVydChlKSc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9BZ2VudENhbGVuZGFyLnBtIC0gdGhlIHB0IGxhbmd1YWdlIGZvciBBZ2VudENhbGVuZGFyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBwdF9BZ2VudENhbGVuZGFyLnBtLHYgMS40IDIwMDgvMDMvMjEgMDI6MTI6NTYgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQWdlbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJFRyYW5zbGF0aW9uID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkVHJhbnNsYXRpb24gbmUgJ0hBU0gnOwoKICAgICRUcmFuc2xhdGlvbi0+eydDVyd9ID0gJ1NlbWFuYSc7CiAgICAkVHJhbnNsYXRpb24tPnsnVG9kYXknfSA9ICdIb2plJzsKICAgICRUcmFuc2xhdGlvbi0+eydUb21vcnJvdyd9ID0gJ0FtYW5o4yc7CiAgICAkVHJhbnNsYXRpb24tPnsnUnVubmluZyd9ID0gJ0VtIGN1cnNvJzsKICAgICRUcmFuc2xhdGlvbi0+eydGZWFzdCBvZiBDb3JwdXMgQ2hyaXN0aSd9ID0gJ0NvcnBvIGRlIENyaXN0byc7CiAgICAkVHJhbnNsYXRpb24tPnsnV2hpdHN1bmRheSd9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnV2hpdG1vbmRheSd9ID0gJyc7CiAgICAkVHJhbnNsYXRpb24tPnsnQXNjZW5zaW9uIG9mIENocmlzdCd9ID0gJ0FzY2Vuc+NvIGRlIENyaXN0byc7CiAgICAkVHJhbnNsYXRpb24tPnsnMSBTdC4gTWF5J30gPSAnUHJpbWVpcm8gZGUgTWFpbyc7CiAgICAkVHJhbnNsYXRpb24tPnsnQ2hyaXN0bWFzJ30gPSAnVulzcGVyYSBkZSBOYXRhbCc7CiAgICAkVHJhbnNsYXRpb24tPnsnRmlyc3QgQ2hyaXN0bWFzIERheSd9ID0gJ05hdGFsJzsKICAgICRUcmFuc2xhdGlvbi0+eydTZWNvbmQgQ2hyaXN0bWFzIERheSd9ID0gJ1NhbnRvIEVzdOp2428nOwogICAgJFRyYW5zbGF0aW9uLT57J1NpbHZlc3Rlcid9ID0gJ1PjbyBTaWx2ZXN0cmUnOwogICAgJFRyYW5zbGF0aW9uLT57J05ldyBZZWFyXCdzIEV2ZSEnfSA9ICdGaW0gZGUgYW5vJzsKICAgICRUcmFuc2xhdGlvbi0+eydKYW51YXJ5J30gPSAnSmFuZWlybyc7CiAgICAkVHJhbnNsYXRpb24tPnsnRmVicnVhcnknfSA9ICdGZXZlcmVpcm8nOwogICAgJFRyYW5zbGF0aW9uLT57J01hcmNoJ30gPSAnTWFy528nOwogICAgJFRyYW5zbGF0aW9uLT57J01heSd9ID0gJ01haW8nOwogICAgJFRyYW5zbGF0aW9uLT57J0FwcmlsJ30gPSAnQWJyaWwnOwogICAgJFRyYW5zbGF0aW9uLT57J0p1bmUnfSA9ICdKdW5obyc7CiAgICAkVHJhbnNsYXRpb24tPnsnSnVseSd9ID0gJ0p1bGhvJzsKICAgICRUcmFuc2xhdGlvbi0+eydBdWd1c3QnfSA9ICdBZ29zdG8nOwogICAgJFRyYW5zbGF0aW9uLT57J1NlcHRlbWJlcid9ID0gJ1NldGVtYnJvJzsKICAgICRUcmFuc2xhdGlvbi0+eydPY3RvYmVyJ30gPSAnT3V0dWJybyc7CiAgICAkVHJhbnNsYXRpb24tPnsnTm92ZW1iZXInfSA9ICdOb3ZlbWJybyc7CiAgICAkVHJhbnNsYXRpb24tPnsnRGVjZW1iZXInfSA9ICdEZXplbWJybyc7CiAgICAkVHJhbnNsYXRpb24tPnsnNSBEYXknfSA9ICc1IERpYXMnOwogICAgJFRyYW5zbGF0aW9uLT57JzcgRGF5J30gPSAnNyBEaWFzJzsKICAgICRUcmFuc2xhdGlvbi0+eyczIE1vbnRoJ30gPSAnMyBNZXNlcyc7CiAgICAkVHJhbnNsYXRpb24tPnsncHVibGljJ30gPSAncPpibGljbyc7CiAgICAkVHJhbnNsYXRpb24tPnsncHJpdmF0ZSd9ID0gJ3ByaXZhZG8nOwogICAgJFRyYW5zbGF0aW9uLT57J3ZhY2F0aW9uJ30gPSAnZm9sZ2EnOwogICAgJFRyYW5zbGF0aW9uLT57J21lZXRpbmcnfSA9ICdyZXVuaeNvJzsKICAgICRUcmFuc2xhdGlvbi0+eydOZXcgRXZlbnQuLi4nfSA9ICdOb3ZvIEV2ZW50by4uLic7CiAgICAkVHJhbnNsYXRpb24tPnsnUGFydGljaXBhbnQnfSA9ICdQYXJ0aWNpcGFudGVzJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK IyAtLQojIEFnZW50Q2FsZW5kYXIuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudENhbGVuZGFyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50Q2FsZW5kYXIuZHRsLHYgMS4xNCAyMDA3LzAxLzE1IDIyOjE2OjU4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6Q3JlYXRlIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkNhbGVuZGFyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDcmVhdGVBY3Rpb24iPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJOZXcifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpdGxlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iJFFEYXRheyJUaXRsZSJ9IiBzaXplPSI3MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkxvY2F0aW9uIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkxvY2F0aW9uIiB2YWx1ZT0iJFFEYXRheyJMb2NhdGlvbiJ9IiBzaXplPSI3MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkRlc2NyaXB0aW9uIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPHRleHRhcmVhIG5hbWU9IkRlc2NyaXB0aW9uIiByb3dzPSI2IiBjb2xzPSI3MCIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSI+JFFEYXRheyJEZXNjcmlwdGlvbiJ9PC90ZXh0YXJlYT48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3RhcnQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiU3RhcnREYXRlU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRW5kIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IkVuZERhdGVTdHJpbmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcXVlbmNlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIj4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJOb25lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9IlNlcXVlbmNlVHlwZSIgdmFsdWU9IiIgJERhdGF7IlNlcXVlbmNlVHlwZTo6Tm9uZSJ9PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IldlZWtseSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiRUZXh0eyJNb24ifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iV2Vla2x5OjpNb24iICREYXRheyJTZXF1ZW5jZVR5cGU6OldlZWtseTo6TW9uIn0+CiRUZXh0eyJUdWUifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iV2Vla2x5OjpUdWUiICREYXRheyJTZXF1ZW5jZVR5cGU6OldlZWtseTo6VHVlIn0+CiRUZXh0eyJXZWQifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iV2Vla2x5OjpXZWQiICREYXRheyJTZXF1ZW5jZVR5cGU6OldlZWtseTo6V2VkIn0+CiRUZXh0eyJUaHUifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iV2Vla2x5OjpUaHUiICREYXRheyJTZXF1ZW5jZVR5cGU6OldlZWtseTo6VGh1In0+CiRUZXh0eyJGcmkifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iV2Vla2x5OjpGcmkiICREYXRheyJTZXF1ZW5jZVR5cGU6OldlZWtseTo6RnJpIn0+CiRUZXh0eyJTYXQifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iV2Vla2x5OjpTYXQiICREYXRheyJTZXF1ZW5jZVR5cGU6OldlZWtseTo6U2F0In0+CiRUZXh0eyJTdW4ifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iV2Vla2x5OjpTdW4iICREYXRheyJTZXF1ZW5jZVR5cGU6OldlZWtseTo6U3VuIn0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7Ik1vbnRobHkifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgokRGF0YXsiTW9udGhseVN0cmluZyJ9CiRUZXh0eyJNb24ifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iTW9udGhseTo6TW9uIiAkRGF0YXsiU2VxdWVuY2VUeXBlOjpNb250aGx5OjpNb24ifT4KJFRleHR7IlR1ZSJ9PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJTZXF1ZW5jZVR5cGUiIHZhbHVlPSJNb250aGx5OjpUdWUiICREYXRheyJTZXF1ZW5jZVR5cGU6Ok1vbnRobHk6OlR1ZSJ9PgokVGV4dHsiV2VkIn08aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9IlNlcXVlbmNlVHlwZSIgdmFsdWU9Ik1vbnRobHk6OldlZCIgJERhdGF7IlNlcXVlbmNlVHlwZTo6TW9udGhseTo6V2VkIn0+CiRUZXh0eyJUaHUifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iTW9udGhseTo6VGh1IiAkRGF0YXsiU2VxdWVuY2VUeXBlOjpNb250aGx5OjpUaHUifT4KJFRleHR7IkZyaSJ9PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJTZXF1ZW5jZVR5cGUiIHZhbHVlPSJNb250aGx5OjpGcmkiICREYXRheyJTZXF1ZW5jZVR5cGU6Ok1vbnRobHk6OkZyaSJ9PgokVGV4dHsiU2F0In08aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9IlNlcXVlbmNlVHlwZSIgdmFsdWU9Ik1vbnRobHk6OlNhdCIgJERhdGF7IlNlcXVlbmNlVHlwZTo6TW9udGhseTo6U2F0In0+CiRUZXh0eyJTdW4ifTxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iTW9udGhseTo6U3VuIiAkRGF0YXsiU2VxdWVuY2VUeXBlOjpNb250aGx5OjpTdW4ifT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiWWVhcmx5In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9IlNlcXVlbmNlVHlwZSIgdmFsdWU9IlllYXJseSIgJERhdGF7IlNlcXVlbmNlVHlwZTo6WWVhcmx5In0+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiU2VxdWVuY2UgRW5kIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiU2VxdWVuY2VFbmREYXRlU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGFydGljaXBhbnQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiUGFydGljaXBhbnRMaXN0In08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZW1pbmRlciJ9OiA8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiUmVtaW5kZXIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6Q3JlYXRlIC0tPgo8IS0tIGR0bDpibG9jazpVcGRhdGUgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ2FsZW5kYXIifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlVwZGF0ZUFjdGlvbiI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXZlbnRJRCIgdmFsdWU9IiRRRGF0YXsiRXZlbnRJRCJ9Ij4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRWRpdCJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTG9jYXRpb24ifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTG9jYXRpb24iIHZhbHVlPSIkUURhdGF7IkxvY2F0aW9uIn0iIHNpemU9IjcwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVzY3JpcHRpb24ifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8dGV4dGFyZWEgbmFtZT0iRGVzY3JpcHRpb24iIHJvd3M9IjYiIGNvbHM9IjcwIiB3cmFwPSIkRW52eyJCcm93c2VyV3JhcCJ9Ij4kUURhdGF7IkRlc2NyaXB0aW9uIn08L3RleHRhcmVhPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGFydCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJTdGFydERhdGVTdHJpbmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJFbmQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiRW5kRGF0ZVN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN0YXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IlN0YXRlU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VxdWVuY2UifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7Ik5vbmUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iU2VxdWVuY2VUeXBlIiB2YWx1ZT0iIiAkRGF0YXsiU2VxdWVuY2VUeXBlOjpOb25lIn0+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV2Vla2x5In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KJFRleHR7Ik1vbiJ9PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJTZXF1ZW5jZVR5cGUiIHZhbHVlPSJXZWVrbHk6Ok1vbiIgJERhdGF7IlNlcXVlbmNlVHlwZTo6V2Vla2x5OjpNb24ifT4KJFRleHR7I