TimeAccounting
1.0.8
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Performance improvements.
Fixed bug# 3028 Wrong translation of month july for german users.
Make TimeAccounting executable on OTRS 2.3. It also runs on 2.2 and 2.1.
Fixed the problem with available year-values in the reporting pulldownmenue.
Fixed a translation bug which costs 10 percent performance in the edit mode.
A new release with the improvements of Torsten Thau. Thank you Torsten.
Fixed the problem if the agent has ro-permissions and try to see old time accounting overviews.
Make the TimeAccounting module fit for OTRS 2.2.
first version build with OPMS
A TimeAccounting Modul.
Ein Zeiterfassungsmodul.
2.1.x
2.2.x
2.3.x
# add groups
$Self->{GroupObject}->GroupAdd(
Name => 'time_accounting',
Comment => '',
ValidID => 1,
UserID => 1,
);
2008-07-28 12:11:55
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpbWVBY2NvdW50aW5nLnhtbCx2IDEuNyAyMDA3LzA1LzExIDE0OjM3OjA1IHRyIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaW1lQWNjb3VudGluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kTW9kdWxlUmVnaXN0cmF0aW9uIGZvciBUaW1lQWNjb3VudGluZ01vZHVsZSAgdG8gZGVmaW5lIHRoZSByZWdpc3RyYXRpb24gc2V0dGluZ3MgaW4gdGhlIHByb2dyYW0gYW5kIHRvIHNldCByaWdodHMgYW5kIHBvc2l0aW9ucyBvZiBpY29ucyBpbiB0aGUgbmF2aWdhdGlvbiBiYXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kTW9kdWxSZWdpc3RyYXRpb24gZvxyIGRhcyBaZWl0ZXJmYXNzdW5nc01vZHVsLiAgSGllcgpr9m5uZW4gU2llIGRpZSBBbmdhYmVuIGb8ciBkaWUgUmVnaXN0cmllcnVuZyBkZXMgTW9kdWxzIGltIFByb2dyYW1tIHTkdGlnZW4uIEZlcm5lcgpr9m5uZW4gZGllIFJlY2h0ZSB1bmQgZGllIFBvc2l0aW9uZW4gZGVyIEljb25zIGluIGRlciBOYXZpZ2F0aW9uc2xlaXN0ZSBnZXNldHp0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPnRpbWVfYWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz50aW1lX2FjY291bnRpbmc8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+VGltZUFjY291bnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+VGltZUFjY291bnRpbmc8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+VGltZUFjY291bnRpbmc8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+VGltZUFjY291bnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlRpbWVBY2NvdW50aW5nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT50aW1lX2FjY291bnRpbmcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZhbXA7U3ViYWN0aW9uPUVkaXQ8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NjAwMDwvUHJpbz4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz50aW1lX2FjY291bnRpbmc8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZhbXA7U3ViYWN0aW9uPU92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlRpbWVBY2NvdW50aW5nPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5vPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+dGltZV9hY2NvdW50aW5nPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5UaW1lUmVjb3JkLUVkaXQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkVkaXQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm5ldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJmFtcDtTdWJhY3Rpb249RWRpdDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgIDxHcm91cD50aW1lX2FjY291bnRpbmc8L0dyb3VwPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5SZXBvcnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlJlcG9ydGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+cmVwb3J0aW5nLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1SZXBvcnRpbmc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjUwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+dGltZV9hY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+U2V0dGluZzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U2V0dGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bW9kdWxlX3NldHRpbmcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZhbXA7U3ViYWN0aW9uPVNldHRpbmc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdE5hbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IG5hbWUgZm9yIG5ldyBwcm9qZWN0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW5pdGlhbGVyIFByb2plY3RuYW1lIGJlaW0gZXJzdGVsbGVuIGVpbmVzIG5ldWVuIFByb2pla3QgaW4gZGVyIFplaXRlcmZhc3N1bmcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdFN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyBwcm9qZWN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVzIG5ldWVuIFByb2pla3RzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+aW52YWxpZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+dmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0QWN0aW9uTmFtZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbmFtZSBmb3IgbmV3IGFjdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkluaXRpYWxlciBOYW1lIGVpbmVyIG5ldWVuIFTkdGlna2VpdCBpbiBkZXIgWmVpdGVyZmFzc3VuZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25TdGF0dXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHN0YXR1cyBvZiBhbiBuZXcgYWN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVyIG5ldWVuIFTkdGlna2VpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPmludmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPnZhbGlkPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJXZWVrbHlIb3VycyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHN0YW5kYXJkIHdlZWtseSBob3Vycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgV29jaGVuYXJiZWl0c3plaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjQwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyTGVhdmVEYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBsZWF2ZSBkYXlzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBVcmxhdWJzdGFnZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjM8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJPdmVydGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc2V0dGluZyBmb3Igb3ZlcnRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkV2ZW50dWVsbCB2b3JoYW5kZW5lciDcYmVyc3R1bmRlbvxiZXJ0cmFnLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4wPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZVN0YXJ0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBkYXRlIHN0YXJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFydGRhdHVtIGb8ciBkaWUgRWluZ2FiZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjIwMDgtMDEtMDE8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlRW5kIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBkYXRlIGVuZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RW5kZGF0dW0gZvxyIGRpZSBFaW5nYWJlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjAwOC0xMi0zMTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlclN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyB1c2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVzIG5ldWVuIEJlbnV0emVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPmludmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPnZhbGlkPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V29ya2luZyBkYXlzIGFmdGVyIGF0IHRoZSBsYXRlc3Qgd29ya2luZyB1bml0cyBoYXZlIHRvIGluc2VydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TGVndCBmZXN0LCBuYWNoIHdpZXZpZWxlbiBXZXJrdGFnZW4gc3DkdGVzdGVucyBkaWUgQXJiZWl0c3N0dW5kZW4gZWluZ2V0cmFnZW4gd2VyZGVuIG38c3Nlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+NDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyB3YXJuaW5nLCBpZiB0byBtdWNoIGluY29tcGxldGUgd29ya2luZyBkYXlzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5aZWlndCBlaW5lIFdhcm51bmcsIHdlbm4genV2aWVsZSBBcmJlaXRzdGFnZSBuaWNodCBlaW5nZXRyYWdlbiB3dXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjI8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6Tm90aWZ5TW9kdWxlIyMjODg4LVRpbWVBY2NvdW50aW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBub3RpZmljYXRpb24gbW9kdWxlIGdpdmVzIGEgd2FybmluZyBpZiB0byBtdWNoIGluY29tcGxldGUgd29ya2luZyBkYXlzIGF2YWlsYWJsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwsIGRhcyBkZW4gQWdlbnQgaW0gTm90aWZpY2F0aW9uLUJlcmVpY2ggZGVzIEFnZW50LUludGVyZmFjZXMgZGFy/GJlciBpbmZvcm1pZXJ0LCB3ZW5uIHNjaG9uIHp1IGxhbmdlIGtlaW5lIFN0dW5kZW4gbWVociBlaW5nZXRyYWdlbiB3dXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZU5vdGlmeTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOb3RpZmljYXRpb25UaW1lQWNjb3VudGluZzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhBbGxvd2VkSW5zZXJ0RGF5cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZvciBob3cgbWFueSBkYXlzIGFnbyB5b3UgY2FuIGluc2VydCB3b3JraW5nIHVuaXRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIGJpcyB3YW5uIG1hbiBpbiDkbHRlcmUgWmVpdGVpbnRy5GdlIGJlYXJiZWl0ZW4ga2FubiAoei4gQi4gMTAgVGFnZSB6dXL8Y2tsaWVnZW5kKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MTA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6UmVkdWNlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRvIHVzZSwgaWYgc29tZSBhY3Rpb25zIGFjb3VudCByZWR1Y2VkIHdvcmtpbmcgaG91cnMoS2V5ID0mZ3Q7IHRyYXZlbGluZzsgQ29udGVudCA9Jmd0OyA1MCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga2FubiBtYW4gZWluZ2ViZW4sIG9iIGb8ciBlaW5lIGJlc3RpbW10ZSBU5HRpZ2tlaXQsIGRpZSB6dSB2ZXJyZWNobmVuZGVuIFN0dW5kZW4gZ2Vr/HJ6dCB3ZXJkZW4uIFouIEIgd2VubiBSZWlzZXplaXRlbiBudXIgenVyIEjkbGZ0ZSB2ZXJn/HRldCB3ZXJkZW4gKEtleSA9Jmd0OyBqb3VybmV5OyBDb250ZW50ID0mZ3Q7IDUwKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJ0cmF2ZWxpbmciPjUwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OklucHV0SG91cnNXaXRob3V0U3RhcnRFbmRUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2V0dGluZywgaWYgd29ya2luZyBob3VycyBjYW4gaW5zZXJ0IHdpdGhvdXQgc3RhcnQtIGFuZCBlbmR0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIG9iIG1hbiBBcmJlaXRzc3R1bmRlbiBhdWNoIG9obmUgQW5mYW5ncy0gdW5kIEVuZHplaXQgZWluZ2ViZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlByZUFwcGxpY2F0aW9uTW9kdWxlIyMjQWdlbnRUaW1lQWNjb3VudGluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgbW9kdWxlIHlvdSBjYW4gZm9yY2UgaW5zZXJ0cyBpbiB0aGUgVGltZUFjY291bnRpbmcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBIaWxmZSBkaWVzZXMgTW9kdWxzIGv2bm5lbiBFaW50cuRnZSBpbiBkaWUgWmVpdGVyZmFzc3VuZyBlcnp3dW5nZW4gd2VyZGVuLCBpbiBkZW0gYmVpbSBFaW5sb2dnZW4gZGFzIFBvcnRhbCBnZWJsb2NrdCB3aXJkIHVuZCBudXIgZGFzIFplaXRlcmZhc3N1bmdzZmVuc3RlciBlcnNjaGVpbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPktlcm5lbDo6TW9kdWxlczo6QWdlbnRUaW1lQWNjb3VudGluZzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
Iy0tCiMgS2VybmVsL1N5c3RlbS9UaW1lQWNjb3VudGluZy5wbSAtIGFsbCB0aW1lIGFjY291bnRpbmcgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBUaW1lQWNjb3VudGluZy5wbSx2IDEuMTQgMjAwOC8wNy8yOCAxMDowNTo0MyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07Cgp1c2UgRGF0ZTo6UGNhbGMgcXcoVG9kYXkgRGF5c19pbl9Nb250aCBEYXlfb2ZfV2Vlayk7CgojdXNlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhckV2ZW50OwoKPWhlYWQxIE5BTUUjCgpLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmcgLSB0aW1lYWNjb3VudGluZyBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHRpbWVhY2NvdW50aW5nIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UjCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkVGltZUFjY291bnRpbmdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVXNlcklEIFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntUaW1lVmFjYXRpb25EYXlzfSAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZVZhY2F0aW9uRGF5cycpOwogICAgJFNlbGYtPntUaW1lVmFjYXRpb25EYXlzT25lVGltZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZVZhY2F0aW9uRGF5c09uZVRpbWUnKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFVzZXJDdXJyZW50UGVyaW9kR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgb2YgdGhlIGN1cnJlbnQgcGVyaW9kIGRhdGEKCiAgICBteSAlVXNlckRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnMTInOwogICAgICAgIERheSAgID0+ICcyNCcKICAgICk7Cgo9Y3V0CgpzdWIgVXNlckN1cnJlbnRQZXJpb2RHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0KICAgICAgICAgICAgICAgIC0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJVc2VyQ3VycmVudFBlcmlvZEdldDogTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERhdGUgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICkgLiAiIDAwOjAwOjAwIjsKCiAgICAjIENhY2hpbmcKICAgIGlmICggJFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J317ICREYXRlIH0gKSB7CiAgICAgICAgcmV0dXJuICV7JFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J317ICREYXRlIH19OwogICAgfQoKICAgICMgZGIgc2VsZWN0CiAgICBteSAlRGF0YSA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PgogICAgICAgICAgICAiU0VMRUNUIHVzZXJfaWQsIHByZWZlcmVuY2VfcGVyaW9kLCBkYXRlX3N0YXJ0LCBkYXRlX2VuZCwgd2Vla2x5X2hvdXJzLCBsZWF2ZV9kYXlzLCBvdmVydGltZSwgc3RhdHVzIEZST00gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICIKICAgICAgICAgICAgLiAiV0hFUkUgZGF0ZV9zdGFydCA8PSAnIgogICAgICAgICAgICAuICREYXRlCiAgICAgICAgICAgIC4gIicgQU5EIGRhdGVfZW5kICA+PSciCiAgICAgICAgICAgIC4gJERhdGUKICAgICAgICAgICAgLiAiJyIsICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICRVc2VyUmVmID0gewogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBQZXJpb2QgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBEYXRlU3RhcnQgICA9PiBzdWJzdHIoICRSb3dbMl0sIDAsIDEwICksCiAgICAgICAgICAgIERhdGVFbmQgICAgID0+IHN1YnN0ciggJFJvd1szXSwgMCwgMTAgKSwKICAgICAgICAgICAgV2Vla2x5SG91cnMgPT4gJFJvd1s0XSwKICAgICAgICAgICAgTGVhdmVEYXlzICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgT3ZlcnRpbWUgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgVXNlclN0YXR1cyAgPT4gJFJvd1s3XSwKICAgICAgICB9OwogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkVXNlclJlZjsKICAgIH0KCiAgICAkU2VsZi0+eydDYWNoZTo6VXNlckN1cnJlbnRQZXJpb2RHZXQnfXsgJERhdGUgfSA9IFwlRGF0YTsKCiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJSZXBvcnRpbmcoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBsZWF2ZWRheXMsIG92ZXJ0aW1lcywKd29ya2luZ2hvdXJzIGV0Yy4gb2YgYWxsIHVzZXJzCgogICAgbXkgJURhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJSZXBvcnRpbmcoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICcxMicsCiAgICAgICAgRGF5ICAgPT4gJzEyJywgICAgICAjIE9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFVzZXJSZXBvcnRpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRGF0YSA9ICgpOwogICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSAmJiAkXyBuZSAnRGF5JyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIlVzZXJSZXBvcnRpbmc6IE5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhJFBhcmFte0RheX0gKSB7CiAgICAgICAgJFBhcmFte0RheX0gPSBEYXlzX2luX01vbnRoKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0gKTsKICAgIH0KCiAgICBteSAlVXNlckN1cnJlbnRQZXJpb2QgPSAkU2VsZi0+VXNlckN1cnJlbnRQZXJpb2RHZXQoJVBhcmFtKTsKICAgIG15ICRZZWFyU3RhcnQgICAgICAgICA9IDA7CiAgICBteSAkTW9udGhTdGFydCAgICAgICAgPSAwOwogICAgbXkgJERheVN0YXJ0ICAgICAgICAgID0gMDsKICAgIG15ICRNb250aFN0YXJ0UG9pbnQgICA9IDA7CiAgICBteSAkRGF5U3RhcnRQb2ludCAgICAgPSAwOwogICAgbXkgJE1vbnRoRW5kUG9pbnQgICAgID0gMDsKICAgIG15ICREYXlFbmRQb2ludCAgICAgICA9IDA7CiAgICBteSAkWWVhckVuZCAgICAgICAgICAgPSAkUGFyYW17WWVhcn07CiAgICBteSAkTW9udGhFbmQgICAgICAgICAgPSAkUGFyYW17TW9udGh9OwogICAgbXkgJERheUVuZCAgICAgICAgICAgID0gJFBhcmFte0RheX07CiAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVVzZXJDdXJyZW50UGVyaW9kICkgewoKICAgICAgICBpZiAoICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtEYXRlU3RhcnR9ID1+IC9eKFxkKyktKFxkKyktKFxkKykvICkgewogICAgICAgICAgICAkWWVhclN0YXJ0ICA9ICQxOwogICAgICAgICAgICAkTW9udGhTdGFydCA9ICQyOwogICAgICAgICAgICAkRGF5U3RhcnQgICA9ICQzOwogICAgICAgIH0KICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheX0gICAgICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17RGlzZWFzZWR9ICAgICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lfSAgICAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZX0gICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlUb3RhbH0gICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e0Rpc2Vhc2VkVG90YWx9ICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZVRvdGFsfSAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGVUb3RhbH0gPSAwOwoKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yICggbXkgJFllYXIgPSAkWWVhclN0YXJ0OyAkWWVhciA8PSAkWWVhckVuZDsgJFllYXIrKyApIHsKICAgICAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhclN0YXJ0ICkgewogICAgICAgICAgICAgICAgJE1vbnRoU3RhcnRQb2ludCA9ICRNb250aFN0YXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE1vbnRoU3RhcnRQb2ludCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhckVuZCApIHsKICAgICAgICAgICAgICAgICRNb250aEVuZFBvaW50ID0gJE1vbnRoRW5kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE1vbnRoRW5kUG9pbnQgPSAxMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKCBteSAkTW9udGggPSAkTW9udGhTdGFydFBvaW50OyAkTW9udGggPD0gJE1vbnRoRW5kUG9pbnQ7ICRNb250aCsrICkgewogICAgICAgICAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhclN0YXJ0ICYmICRNb250aCA9PSAkTW9udGhTdGFydCApIHsKICAgICAgICAgICAgICAgICAgICAkRGF5U3RhcnRQb2ludCA9ICREYXlTdGFydDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICREYXlTdGFydFBvaW50ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJFllYXIgPT0gJFllYXJFbmQgJiYgJE1vbnRoID09ICRNb250aEVuZCApIHsKICAgICAgICAgICAgICAgICAgICAkRGF5RW5kUG9pbnQgPSAkRGF5RW5kOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJERheUVuZFBvaW50ID0gRGF5c19pbl9Nb250aCggJFllYXIsICRNb250aCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICggbXkgJERheSA9ICREYXlTdGFydFBvaW50OyAkRGF5IDw9ICREYXlFbmRQb2ludDsgJERheSsrICkgewogICAgICAgICAgICAgICAgICAgIG15ICVXb3JraW5nVW5pdCA9ICRTZWxmLT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+ICREYXksCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJFdvcmtpbmdIb3VycyA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJExlYXZlRGF5ICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJERpc2Vhc2VkICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJE92ZXJ0aW1lICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldFN0YXRlICA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yICgga2V5cyAlV29ya2luZ1VuaXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRXb3JraW5nSG91cnMgKz0gJFdvcmtpbmdVbml0eyRffXtQZXJpb2R9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRXb3JraW5nVW5pdHskX317UHJvamVjdElEfSA9PSAtMSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFdvcmtpbmdVbml0eyRffXtBY3Rpb25JRH0gPT0gLTIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGVhdmVEYXkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkV29ya2luZ1VuaXR7JF99e0FjdGlvbklEfSA9PSAtMSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtEaXNlYXNlZFRvdGFsfSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREaXNlYXNlZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRXb3JraW5nVW5pdHskX317QWN0aW9uSUR9ID09IC0zICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVG90YWx9Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE92ZXJ0aW1lID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17V29ya2luZ0hvdXJzVG90YWx9ICs9ICRXb3JraW5nSG91cnM7CiAgICAgICAgICAgICAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRXZWVrZGF5ID0gRGF5X29mX1dlZWsoICRZZWFyLCAkTW9udGgsICREYXkgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICAgJFdlZWtkYXkgIT0gNgogICAgICAgICAgICAgICAgICAgICAgICAmJiAkV2Vla2RheSAhPSA3CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkVmFjYXRpb25DaGVjawogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJERpc2Vhc2VkCiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkTGVhdmVEYXkgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGVUb3RhbH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9ICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtXZWVrbHlIb3Vyc30gLyA1OwogICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0U3RhdGUgPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17V2Vla2x5SG91cnN9IC8gNTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggJE1vbnRoID09ICRNb250aEVuZCAmJiAkWWVhciA9PSAkWWVhckVuZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGV9ICArPSAkVGFyZ2V0U3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc30gKz0gJFdvcmtpbmdIb3VyczsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXl9ICAgICArPSAkTGVhdmVEYXk7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e0Rpc2Vhc2VkfSAgICAgKz0gJERpc2Vhc2VkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZX0gPSAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnN9IC0gJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGV9OwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVG90YWx9CiAgICAgICAgICAgID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e092ZXJ0aW1lfQogICAgICAgICAgICArICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc1RvdGFsfQogICAgICAgICAgICAtICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlVG90YWx9OwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVW50aWx9ID0gJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0gLSAkRGF0YXskVXNlcklEfXtPdmVydGltZX07CiAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlSZW1haW5pbmd9CiAgICAgICAgICAgID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e0xlYXZlRGF5c30gLSAkRGF0YXskVXNlcklEfXtMZWF2ZURheVRvdGFsfTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHByb2plY3QgZGF0YQoKICAgIG15ICVQcm9qZWN0RGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzR2V0KCk7Cgo9Y3V0CgpzdWIgUHJvamVjdFNldHRpbmdzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJURhdGEgPSAoKTsKCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIHByb2plY3QsIGRlc2NyaXB0aW9uLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCcsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAkSUQgPSAkUm93WzBdOwogICAgICAgICREYXRhe1Byb2plY3R9eyAkSUQgfSAgICAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXtQcm9qZWN0RGVzY3JpcHRpb259eyAkSUQgfSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7UHJvamVjdFN0YXR1c317ICRJRCB9ICAgICAgPSAkUm93WzNdOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBQcm9qZWN0U2V0dGluZ3NJbnNlcnQoKQoKaW5zZXJ0IG5ldyBwcm9qZWN0IGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0U2V0dGluZ3NJbnNlcnQoCiAgICAgICAgUHJvamVjdCAgICAgICA9PiAnaW50ZXJuYWwnLCAjIG9wdGlvbmFsCiAgICAgICAgUHJvamVjdFN0YXR1cyA9PiAxIHx8IDAsICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RTZXR0aW5nc0luc2VydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtQcm9qZWN0fSApIHsKICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRQcm9qZWN0TmFtZScpIHx8ICcnOwogICAgfQogICAgaWYgKCAhJFBhcmFte1Byb2plY3RTdGF0dXN9ICkgewogICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFByb2plY3RTdGF0dXMnKQogICAgICAgICAgICB8fCAnMCc7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gPSAnJzsKICAgIH0KCiAgICAjIGRiIHF1b3RlCiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICB9CgogICAgIyBidWlsZCBzcWwKCiAgICBteSAkU1FMCiAgICAgICAgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3Byb2plY3QgKHByb2plY3QsIGRlc2NyaXB0aW9uLCBzdGF0dXMpICIKICAgICAgICAuICJWQUxVRVMgIiAuICIoJyIKICAgICAgICAuICRQYXJhbXtQcm9qZWN0fSAuICInLCAnIgogICAgICAgIC4gJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gLiAiJywgJyIKICAgICAgICAuICRQYXJhbXtQcm9qZWN0U3RhdHVzfSAuICInKSI7CgogICAgIyBkYiBpbnNlcnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFByb2plY3RTZXR0aW5nc1VwZGF0ZSgpCgp1cGRhdGUgcHJvamVjdCBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzVXBkYXRlKAogICAgICAgIDEgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgUHJvamVjdElECiAgICAgICAgICAgIFByb2plY3QgICAgICAgPT4gJ2ludGVybmFsJywKICAgICAgICAgICAgUHJvamVjdFN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAyICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIFByb2plY3RJRAogICAgICAgICAgICBQcm9qZWN0ICAgICAgID0+ICdwcm9qZWN0bmFtZScsCiAgICAgICAgICAgIFByb2plY3RTdGF0dXMgPT4gMSB8fCAwLAogICAgICAgIH0sCiAgICAgICAgMyAgICA9PiAuLi4uLi4KICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdFNldHRpbmdzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBmb3IgbXkgJFByb2plY3RJRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JFByb2plY3RJRH17UHJvamVjdH0gKSB7CgogICAgICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgICAgIGZvciAoIGtleXMgJXsgJFBhcmFteyRQcm9qZWN0SUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFByb2plY3RJRH17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFByb2plY3RJRH17JF99ICkgfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgICAgIG15ICRTUUwKICAgICAgICAgICAgICAgID0gIlVQREFURSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCAiCiAgICAgICAgICAgICAgICAuICJTRVQgcHJvamVjdCA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0fQogICAgICAgICAgICAgICAgLiAiJywgc3RhdHVzID0gJyIKICAgICAgICAgICAgICAgIC4gJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3RTdGF0dXN9CiAgICAgICAgICAgICAgICAuICInLCBkZXNjcmlwdGlvbiA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0RGVzY3JpcHRpb259IC4gIicgIgogICAgICAgICAgICAgICAgLiAiV0hFUkUgaWQgPSAnIgogICAgICAgICAgICAgICAgLiAkUHJvamVjdElEIC4gIiciOwoKICAgICAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGlvblNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIGFjdGlvbiBzZXR0aW5ncwoKICAgIG15ICVBY3Rpb25EYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5BY3Rpb25TZXR0aW5nc0dldCgpOwoKPWN1dAoKc3ViIEFjdGlvblNldHRpbmdzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJURhdGEgPSAoKTsKCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGlkLCBhY3Rpb24sIHN0YXR1cyBGUk9NIHRpbWVfYWNjb3VudGluZ19hY3Rpb24iLCApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0FjdGlvbn0gICAgICAgPSAkUm93WzFdOwogICAgICAgICREYXRheyAkUm93WzBdIH17QWN0aW9uU3RhdHVzfSA9ICRSb3dbMl07CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIEFjdGlvblNldHRpbmdzSW5zZXJ0KCkKCmluc2VydCBuZXcgYWN0aW9uIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5BY3Rpb25TZXR0aW5nc0luc2VydCgKICAgICAgICBBY3Rpb24gICAgICAgPT4gJ21lZXRpbmcnLCAgICMgb3B0aW9uYWwKICAgICAgICBBY3Rpb25TdGF0dXMgPT4gMSB8fCAwLCAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aW9uU2V0dGluZ3NJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRiIHF1b3RlCiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte0FjdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte0FjdGlvbn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25OYW1lJykgfHwgJyc7CiAgICB9CiAgICBpZiAoICEkUGFyYW17QWN0aW9uU3RhdHVzfSApIHsKICAgICAgICAkUGFyYW17QWN0aW9uU3RhdHVzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdEFjdGlvblN0YXR1cycpCiAgICAgICAgICAgIHx8ICcwJzsKICAgIH0KCiAgICAjIGJ1aWxkIHNxbAogICAgbXkgJFNRTAogICAgICAgID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gKGFjdGlvbiwgc3RhdHVzKSIKICAgICAgICAuICIgVkFMVUVTIiAuICIgKCciCiAgICAgICAgLiAkUGFyYW17QWN0aW9ufSAuICInICwgJyIKICAgICAgICAuICRQYXJhbXtBY3Rpb25TdGF0dXN9IC4gIicpIjsKCiAgICAjIGRiIGluc2VydAogICAgcmV0dXJuICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aW9uU2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIGFjdGlvbiBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NVcGRhdGUoCiAgICAgICAgMSAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgQWN0aW9uSUQKICAgICAgICAgICAgQWN0aW9uICAgICAgID0+ICdtZWV0aW5nJywKICAgICAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIEFjdGlvbklECiAgICAgICAgICAgIEFjdGlvbiAgICAgICA9PiAnam91cm5leScsCiAgICAgICAgICAgIEFjdGlvblN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAzICAgID0+IC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25TZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IGtleXMgJVBhcmFtICkgewogICAgICAgIGlmICggJFBhcmFteyRBY3Rpb25JRH17QWN0aW9ufSApIHsKCiAgICAgICAgICAgICMgZGIgcXVvdGUKICAgICAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17JEFjdGlvbklEfSB9ICkgewogICAgICAgICAgICAgICAgJFBhcmFteyRBY3Rpb25JRH17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFjdGlvbklEfXskX30gKSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAgICAgbXkgJFNRTAogICAgICAgICAgICAgICAgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gIgogICAgICAgICAgICAgICAgLiAiU0VUIGFjdGlvbiA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskQWN0aW9uSUR9e0FjdGlvbn0KICAgICAgICAgICAgICAgIC4gIicsIHN0YXR1cyA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30gLiAiJyAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSBpZCA9ICciCiAgICAgICAgICAgICAgICAuICRBY3Rpb25JRCAuICInIjsKCiAgICAgICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBVc2VyR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgZGF0YQoKICAgIG15ICVVc2VyRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlckdldCgpOwoKPWN1dAoKc3ViIFVzZXJHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCB1c2VyX2lkLCBkZXNjcmlwdGlvbiwgc2hvd19vdmVydGltZSwgY3JlYXRlX3Byb2plY3QgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlcicsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e1VzZXJJRH0gICAgICAgID0gJFJvd1swXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0Rlc2NyaXB0aW9ufSAgID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e1Nob3dPdmVydGltZX0gID0gJFJvd1syXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0NyZWF0ZVByb2plY3R9ID0gJFJvd1szXTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gVXNlclNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgcGVyaW9kIGRhdGEKCiAgICBteSAlVXNlckRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJTZXR0aW5nc0dldCgpOwoKPWN1dAoKc3ViIFVzZXJTZXR0aW5nc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVEYXRhID0gKCk7CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4KICAgICAgICAgICAgIlNFTEVDVCB1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIHdlZWtseV9ob3VycywgbGVhdmVfZGF5cywgb3ZlcnRpbWUsIHN0YXR1cyBGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17VXNlcklEfSAgICAgID0gJFJvd1swXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17UGVyaW9kfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17RGF0ZVN0YXJ0fSAgID0gc3Vic3RyKCAkUm93WzJdLCAwLCAxMCApOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtEYXRlRW5kfSAgICAgPSBzdWJzdHIoICRSb3dbM10sIDAsIDEwICk7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e1dlZWtseUhvdXJzfSA9ICRSb3dbNF07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e0xlYXZlRGF5c30gICA9ICRSb3dbNV07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e092ZXJ0aW1lfSAgICA9ICRSb3dbNl07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e1VzZXJTdGF0dXN9ICA9ICRSb3dbN107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJTZXR0aW5nc0luc2VydCgpCgppbnNlcnQgbmV3IHVzZXIgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJTZXR0aW5nc0luc2VydCgKICAgICAgICBVc2VySUQgICAgICAgPT4gJzInLAogICAgICAgIFBlcmlvZCAgICAgICA9PiAnMicsCiAgICApOwoKPWN1dAoKc3ViIFVzZXJTZXR0aW5nc0luc2VydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J307CgogICAgJFBhcmFte1dlZWtseUhvdXJzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJXZWVrbHlIb3VycycpCiAgICAgICAgfHwgJzQwJzsKICAgICRQYXJhbXtMZWF2ZURheXN9ICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJMZWF2ZURheXMnKSB8fCAnMjUnOwogICAgJFBhcmFte1VzZXJTdGF0dXN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlclN0YXR1cycpICAgIHx8ICcxJzsKICAgICRQYXJhbXtPdmVydGltZX0gICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJPdmVydGltZScpICB8fCAnMCc7CiAgICAkUGFyYW17RGF0ZUVuZH0gICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZUVuZCcpCiAgICAgICAgfHwgJzIwMDctMTItMzEnOwogICAgJFBhcmFte0RhdGVTdGFydH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZVN0YXJ0JykKICAgICAgICB8fCAnMjAwNy0wMS0wMSc7CiAgICAkUGFyYW17RGVzY3JpcHRpb259ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRlc2NyaXB0aW9uJykKICAgICAgICB8fCAnJzsKCiAgICAjIGRiIHF1b3RlCiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICk7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgc3FsCiAgICBteSAkU1FMCiAgICAgICAgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICh1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIgogICAgICAgIC4gIiB3ZWVrbHlfaG91cnMsIGxlYXZlX2RheXMsIG92ZXJ0aW1lLCBzdGF0dXMpIgogICAgICAgIC4gIiBWQUxVRVMiCiAgICAgICAgLiAiICgnJFBhcmFte1VzZXJJRH0nLCAnJFBhcmFte1BlcmlvZH0nLCAnJFBhcmFte0RhdGVTdGFydH0gMDA6MDA6MDAnLCAnJFBhcmFte0RhdGVFbmR9IDAwOjAwOjAwJywiCiAgICAgICAgLiAiICckUGFyYW17V2Vla2x5SG91cnN9JywgJyRQYXJhbXtMZWF2ZURheXN9JywgJyRQYXJhbXtPdmVydGltZX0nLCAnJFBhcmFte1VzZXJTdGF0dXN9JykiOwoKICAgICMgZGIgaW5zZXJ0CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKCiAgICAjIFNwbGl0IHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIHNlcGVyYXRlIGZ1bmN0aW9uIQoKICAgICNjaGVjayBpZiB0aGUgdXNlciBzdGlsbCBleGlzdHMKICAgIG15ICRVc2VySUQ7CgogICAgIyBidWlsZCBzcWwKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHVzZXJfaWQgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlciBXSEVSRSB1c2VyX2lkID0gJyIgLiAkUGFyYW17VXNlcklEfSAuICInIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRVc2VySUQgPSAkUm93WzBdOwogICAgfQogICAgaWYgKCAhZGVmaW5lZCgkVXNlcklEKSApIHsKICAgICAgICAkU1FMCiAgICAgICAgICAgID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ191c2VyICh1c2VyX2lkLCBkZXNjcmlwdGlvbikiCiAgICAgICAgICAgIC4gIiBWQUxVRVMiCiAgICAgICAgICAgIC4gIiAoJyRQYXJhbXtVc2VySUR9JywgJyRQYXJhbXtEZXNjcmlwdGlvbn0nKSI7CgogICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVXNlclNldHRpbmdzVXBkYXRlKCkKCnVwZGF0ZSB1c2VyIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NVcGRhdGUoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAxIHx8IDAsCiAgICAgICAgU2hvd092ZXJ0aW1lICA9PiAxIHx8IDAsCiAgICAgICAgMSAgICA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU29tZSBUZXh0JywKICAgICAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAxIHx8IDAsCiAgICAgICAgICAgIFNob3dPdmVydGltZSAgPT4gMSB8fCAwLAogICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVyaW9kICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAnMjAwNS0xMi0xMicsCiAgICAgICAgICAgICAgICBEYXRlRW5kICAgICAgPT4gJzIwMDUtMTItMzEnLAogICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICczOCcsCiAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJzI1JywKICAgICAgICAgICAgICAgIE92ZXJ0aW1lICAgICA9PiAnMzgnLAogICAgICAgICAgICAgICAgVXNlclN0YXR1cyAgID0+IDEgfHwgMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4gewogICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAyLAogICAgICAgICAgICAgICAgUGVyaW9kICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAnMjAwNS0xMi0xMicsCiAgICAgICAgICAgICAgICBEYXRlRW5kICAgICAgPT4gJzIwMDUtMTItMzEnLAogICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICczOCcsCiAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJzI1JywKICAgICAgICAgICAgICAgIE92ZXJ0aW1lICAgICA9PiAnMzgnLAogICAgICAgICAgICAgICAgVXNlclN0YXR1cyAgID0+IDEgfHwgMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIDMgICAgPT4gLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIFVzZXJTZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J307CgogICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVBhcmFtICkgewogICAgICAgIGZvciAocXcoVXNlcklEIERlc2NyaXB0aW9uKSkgewogICAgICAgICAgICAkUGFyYW17JFVzZXJJRH17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFVzZXJJRH17JF99ICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjc2V0IGRlZmF1bHQgZm9yIFNob3dPdmVyVGltZS4uLgogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskVXNlcklEfXtTaG93T3ZlcnRpbWV9ICkgKSB7CiAgICAgICAgICAgICRQYXJhbXskVXNlcklEfXtTaG93T3ZlcnRpbWV9ID0gMDsKICAgICAgICB9CgogICAgICAgICNzZXQgZGVmYXVsdCBmb3IgQ3JlYXRlUHJvamVjdC4uLgogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskVXNlcklEfXtDcmVhdGVQcm9qZWN0fSApICkgewogICAgICAgICAgICAkUGFyYW17JFVzZXJJRH17Q3JlYXRlUHJvamVjdH0gPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICBteSAkU1FMCiAgICAgICAgICAgID0gIlVQREFURSB0aW1lX2FjY291bnRpbmdfdXNlciAiCiAgICAgICAgICAgIC4gIlNFVCBkZXNjcmlwdGlvbiA9ICciCiAgICAgICAgICAgIC4gJFBhcmFteyRVc2VySUR9e0Rlc2NyaXB0aW9ufQogICAgICAgICAgICAuICInLCBzaG93X292ZXJ0aW1lID0gJyIKICAgICAgICAgICAgLiAkUGFyYW17JFVzZXJJRH17U2hvd092ZXJ0aW1lfQogICAgICAgICAgICAuICInLCBjcmVhdGVfcHJvamVjdCA9ICciCiAgICAgICAgICAgIC4gJFBhcmFteyRVc2VySUR9e0NyZWF0ZVByb2plY3R9IC4gIicgIgogICAgICAgICAgICAuICJXSEVSRSB1c2VyX2lkID0gJyIKICAgICAgICAgICAgLiAkUGFyYW17JFVzZXJJRH17VXNlcklEfSAuICInIjsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKCiAgICAgICAgZm9yIChxdyhVc2VySUQgRGVzY3JpcHRpb24gU2hvd092ZXJ0aW1lIENyZWF0ZVByb2plY3QpKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW17JFVzZXJJRH17JF99OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFBlcmlvZCAoIGtleXMgJXsgJFBhcmFteyRVc2VySUR9IH0gKSB7CgogICAgICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgICAgIGZvciAoIGtleXMgJXsgJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9IH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFVzZXJJRH17JFBlcmlvZH17JF99CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXskX30gKSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAgICAgbXkgJFNRTAogICAgICAgICAgICAgICAgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCAiCiAgICAgICAgICAgICAgICAuICJTRVQgbGVhdmVfZGF5cyA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtMZWF2ZURheXN9CiAgICAgICAgICAgICAgICAuICInLCBkYXRlX3N0YXJ0ID0gJyIKICAgICAgICAgICAgICAgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e0RhdGVTdGFydH0KICAgICAgICAgICAgICAgIC4gIicsIGRhdGVfZW5kID0gJyIKICAgICAgICAgICAgICAgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e0RhdGVFbmR9CiAgICAgICAgICAgICAgICAuICInLCBvdmVydGltZSA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtPdmVydGltZX0KICAgICAgICAgICAgICAgIC4gIicsIHdlZWtseV9ob3VycyA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtXZWVrbHlIb3Vyc30KICAgICAgICAgICAgICAgIC4gIicsIHN0YXR1cyA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtVc2VyU3RhdHVzfSAuICInICIKICAgICAgICAgICAgICAgIC4gIldIRVJFIHVzZXJfaWQgPSAnIgogICAgICAgICAgICAgICAgLiAkUGFyYW17JFVzZXJJRH17JFBlcmlvZH17VXNlcklEfQogICAgICAgICAgICAgICAgLiAiJyBBTkQgcHJlZmVyZW5jZV9wZXJpb2QgPSAnIgogICAgICAgICAgICAgICAgLiAkUGVyaW9kIC4gIiciOwoKICAgICAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgaW5jb21wbGV0ZSB3b3JraW5nIGRheXMgYW5kCnRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgaW5jb21wbGV0ZSB3b3JraW5nIGRheSBhcmUgaW4gdGhlIGFsbG93ZWQKcmFuZ2UuCgogICAgbXkgJVdvcmtpbmdVbml0c0NoZWNrID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrKAogICAgICAgIFVzZXJJRCA9PiAnMicsICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgICAgICAgICAgICAgID0gKCk7CiAgICBteSAkV29ya2luZ1VuaXRJRCAgICAgICA9IDA7CiAgICBteSAlQ29tcGxldGVXb3JraW5nRGF5cyA9ICgpOwogICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLCApOwoKICAgIG15ICRVc2VySUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtVc2VySUR9ICkgfHwgJFNlbGYtPntVc2VySUR9OwoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4KICAgICAgICAgICAgIlNFTEVDVCBESVNUSU5DVCB0aW1lX3N0YXJ0IEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHVzZXJfaWQgPSAnJFVzZXJJRCciLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eKFxkKyktKFxkKyktKFxkKykvICkgewogICAgICAgICAgICAkQ29tcGxldGVXb3JraW5nRGF5c3skMX17JDJ9eyQzfSA9IDE7CiAgICAgICAgfQogICAgfQogICAgbXkgJVVzZXJDdXJyZW50UGVyaW9kID0gJFNlbGYtPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgKTsKICAgIG15ICRXb3JraW5nRGF5cyAgICAgPSAwOwogICAgbXkgJFllYXJTdGFydCAgICAgICA9IDA7CiAgICBteSAkTW9udGhTdGFydCAgICAgID0gMDsKICAgIG15ICREYXlTdGFydCAgICAgICAgPSAwOwogICAgbXkgJE1vbnRoU3RhcnRQb2ludCA9IDA7CiAgICBteSAkRGF5U3RhcnRQb2ludCAgID0gMDsKICAgIG15ICRNb250aEVuZFBvaW50ICAgPSAwOwogICAgbXkgJERheUVuZFBvaW50ICAgICA9IDA7CiAgICBteSAkWWVhckVuZCAgICAgICAgID0gJFllYXI7CiAgICBteSAkTW9udGhFbmQgICAgICAgID0gJE1vbnRoOwogICAgbXkgJERheUVuZCAgICAgICAgICA9ICREYXk7CgogICAgaWYgKCAkVXNlckN1cnJlbnRQZXJpb2R7ICRVc2VySUQgfXtEYXRlU3RhcnR9ID1+IC9eKFxkKyktKFxkKyktKFxkKykvICkgewogICAgICAgICRZZWFyU3RhcnQgID0gJDE7CiAgICAgICAgJE1vbnRoU3RhcnQgPSAkMjsKICAgICAgICAkRGF5U3RhcnQgICA9ICQzOwogICAgfQoKICAgIGZvciAoIG15ICRZZWFyID0gJFllYXJTdGFydDsgJFllYXIgPD0gJFllYXJFbmQ7ICRZZWFyKysgKSB7CiAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhclN0YXJ0ICkgewogICAgICAgICAgICAkTW9udGhTdGFydFBvaW50ID0gJE1vbnRoU3RhcnQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTW9udGhTdGFydFBvaW50ID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhckVuZCApIHsKICAgICAgICAgICAgJE1vbnRoRW5kUG9pbnQgPSAkTW9udGhFbmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTW9udGhFbmRQb2ludCA9IDEyOwogICAgICAgIH0KICAgICAgICBmb3IgKCBteSAkTW9udGggPSAkTW9udGhTdGFydFBvaW50OyAkTW9udGggPD0gJE1vbnRoRW5kUG9pbnQ7ICRNb250aCsrICkgewogICAgICAgICAgICBpZiAoICRZZWFyID09ICRZZWFyU3RhcnQgJiYgJE1vbnRoID09ICRNb250aFN0YXJ0ICkgewogICAgICAgICAgICAgICAgJERheVN0YXJ0UG9pbnQgPSAkRGF5U3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF5U3RhcnRQb2ludCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhckVuZCAmJiAkTW9udGggPT0gJE1vbnRoRW5kICkgewogICAgICAgICAgICAgICAgJERheUVuZFBvaW50ID0gJERheUVuZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXlFbmRQb2ludCA9IERheXNfaW5fTW9udGgoICRZZWFyLCAkTW9udGggKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkTW9udGhTdHJpbmcgPSBzcHJpbnRmKCAiJTAyZCIsICRNb250aCApOwogICAgICAgICAgICBmb3IgKCBteSAkRGF5ID0gJERheVN0YXJ0UG9pbnQ7ICREYXkgPD0gJERheUVuZFBvaW50OyAkRGF5KysgKSB7CiAgICAgICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkRGF5U3RyaW5nID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgICAgICAgICBteSAkV2Vla2RheSA9IERheV9vZl9XZWVrKCAkWWVhciwgJE1vbnRoLCAkRGF5ICk7CiAgICAgICAgICAgICAgICBpZiAoICRXZWVrZGF5ICE9IDYgJiYgJFdlZWtkYXkgIT0gNyAmJiAhJFZhY2F0aW9uQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdEYXlzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICAgJFdlZWtkYXkgIT0gNgogICAgICAgICAgICAgICAgICAgICYmICRXZWVrZGF5ICE9IDcKICAgICAgICAgICAgICAgICAgICAmJiAhJFZhY2F0aW9uQ2hlY2sKICAgICAgICAgICAgICAgICAgICAmJiAhJENvbXBsZXRlV29ya2luZ0RheXN7JFllYXJ9eyRNb250aFN0cmluZ317JERheVN0cmluZ30gKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGhTdHJpbmd9eyREYXlTdHJpbmd9ID0gJFdvcmtpbmdEYXlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXMKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzJykgfHwgJzUnOwogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6Ok1heEludGVydmFsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmcnKQogICAgICAgIHx8ICczJzsKICAgIGZvciBteSAkWWVhciAoIGtleXMgJXsgJERhdGF7SW5jb21wbGV0ZX0gfSApIHsKICAgICAgICBmb3IgbXkgJE1vbnRoICgga2V5cyAleyAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICREYXkgKCBrZXlzICV7ICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGh9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGh9eyREYXl9CiAgICAgICAgICAgICAgICAgICAgPCAkV29ya2luZ0RheXMgLSAkTWF4SW50ZXJ2YWxsT2ZJbmNvbXBsZXRlRGF5cyApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7RW5mb3JjZUluc2VydH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRofXskRGF5fQogICAgICAgICAgICAgICAgICAgIDwgJFdvcmtpbmdEYXlzIC0gJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtXYXJuaW5nfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgd29ya2luZyB1bml0cyBkYXRhCgogICAgbXkgJVdvcmtpbmdVbml0c0RhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0dldCgKICAgICAgICBZZWFyICAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoICA9PiAnNycsCiAgICAgICAgRGF5ICAgID0+ICcxMycsCiAgICAgICAgVXNlcklEID0+ICcyJywgICAgIyBPcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRGF0YSAgICAgICAgICA9ICgpOwogICAgbXkgJFdvcmtpbmdVbml0SUQgPSAwOwogICAgZm9yICgga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgfQogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICB9CgogICAgbXkgJERhdGUgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fQogICAgICAgIC0+UHJlcGFyZSggU1FMID0+ICJTRUxFQ1QgdXNlcl9pZCwgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCByZW1hcmssIHRpbWVfc3RhcnQsIHRpbWVfZW5kLCIKICAgICAgICAgICAgLiAiIHBlcmlvZCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSB0aW1lX3N0YXJ0IExJS0UgJyREYXRlJSciCiAgICAgICAgICAgIC4gIiBBTkQgdXNlcl9pZCA9ICckUGFyYW17VXNlcklEfScgT1JERVIgYnkgaWQiLCApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbNF0gPX4gL14oLis/KVxzKFxkKzpcZCspOihcZCspLyApIHsKICAgICAgICAgICAgJFdvcmtpbmdVbml0SUQrKzsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1VzZXJJRH0gICAgPSAkUm93WzBdOwogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSA9ICRSb3dbMV07CiAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gID0gJFJvd1syXTsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1JlbWFya30gICAgPSAkUm93WzNdOwogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSA9ICQyOwogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRSb3dbNl0gKSApIHsKICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gc3ByaW50ZiggIiUuMmYiLCAkUm93WzZdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtEYXRlfSA9ICQxOwogICAgICAgICAgICBpZiAoICRSb3dbNV0gPX4gL14oLis/KVxzKFxkKzpcZCspOihcZCspLyApIHsKICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfSA9ICQyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNJbnNlcnQoKQoKaW5zZXJ0IHdvcmtpbmcgdW5pdHMgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNJbnNlcnQoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICcwNycsCiAgICAgICAgRGF5ICAgPT4gJzAyJywKICAgICAgICAxICAgID0+IHsKICAgICAgICAgICAgUHJvamVjdElEID0+IDEsCiAgICAgICAgICAgIEFjdGlvbklEICA9PiAyMywKICAgICAgICAgICAgUmVtYXJrICAgID0+IDQsCiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnNzozMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMTE6MDAnLAogICAgICAgICAgICBQZXJpb2QgICAgPT4gJzguNScsCiAgICAgICAgfSwKICAgICAgICAyIC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0KICAgICAgICAgICAgICAgIC0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJXb3JraW5nVW5pdHNJbnNlcnQ6IE5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGUgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CgogICAgaWYgKCEkU2VsZi0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGRlbGV0ZSAkUGFyYW17WWVhcn07CiAgICBkZWxldGUgJFBhcmFte01vbnRofTsKICAgIGRlbGV0ZSAkUGFyYW17RGF5fTsKCiAgICAjaW5zZXJ0IG5ldyB3b3JraW5nIHVuaXRzCiAgICBmb3IgbXkgJFdvcmtpbmdVbml0SUQgKCBzb3J0IGtleXMgJVBhcmFtICkgewoKICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17JFdvcmtpbmdVbml0SUR9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskV29ya2luZ1VuaXRJRH17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFdvcmtpbmdVbml0SUR9eyRffSApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICB9CiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICREYXRlIC4gIiAiIC4gJFBhcmFteyRXb3JraW5nVW5pdElEfXtTdGFydFRpbWV9OwogICAgICAgIG15ICRFbmRUaW1lICAgPSAkRGF0ZSAuICIgIiAuICRQYXJhbXskV29ya2luZ1VuaXRJRH17RW5kVGltZX07CgogICAgICAgIGlmICggICAoICFkZWZpbmVkKCAkUGFyYW17JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gKSApCiAgICAgICAgICAgIHx8ICggJFBhcmFteyRXb3JraW5nVW5pdElEfXtQZXJpb2R9IGVxICcnICkgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFteyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gJ05VTEwnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICBteSAkU1FMCiAgICAgICAgICAgID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ190YWJsZSAodXNlcl9pZCwgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCByZW1hcmssIgogICAgICAgICAgICAuICIgdGltZV9zdGFydCwgdGltZV9lbmQsIHBlcmlvZCwgY3JlYXRlZCApIgogICAgICAgICAgICAuICIgVkFMVUVTIgogICAgICAgICAgICAuICIgKCckU2VsZi0+e1VzZXJJRH0nLCAnJFBhcmFteyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9JywgJyRQYXJhbXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9JywiCiAgICAgICAgICAgIC4gIiAnJFBhcmFteyRXb3JraW5nVW5pdElEfXtSZW1hcmt9JywgJyRTdGFydFRpbWUnLCAnJEVuZFRpbWUnLCAkUGFyYW17JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0sIgogICAgICAgICAgICAuICIgY3VycmVudF90aW1lc3RhbXApIjsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNEZWxldGUoKQoKZGVsZXRzIHdvcmtpbmcgdW5pdHMgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICc3JywKICAgICAgICBEYXkgICA9PiAnMTMnLAogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0KICAgICAgICAgICAgICAgIC0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJXb3JraW5nVW5pdHNJbnNlcnQ6IE5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGUgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CgogICAgIyBkZWxldGUgb2xkIHdvcmtpbmcgdW5pdHMKICAgIG15ICRTUUwgPSAiREVMRVRFIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlICIKICAgICAgICAuICJXSEVSRSB0aW1lX3N0YXJ0IExJS0UgJyREYXRlJScgQU5EIHVzZXJfaWQgPSAnJFNlbGYtPntVc2VySUR9JyI7CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKICAgIHJldHVybiAxOwp9CgojIEZSQU1FV09SSy0yLjE6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSB0aW1lb2JqZWN0Cgo9aXRlbSBWYWNhdGlvbkNoZWNrKCkKCmNoZWNrIGlmIHRoZSBzZWxlY3RlZCBkYXkgaXMgYSB2YWNhdGlvbiAoaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91Cmluc2VydCAwMSBvciAxIGZvciBtb250aCBvciBkYXkgaW4gdGhlIGZ1bmN0aW9uIG9yIGluIHRoZSBTeXNDb25maWcpCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5WYWNhdGlvbkNoZWNrKAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnNycsIHx8IDA3CiAgICAgICAgRGF5ICAgPT4gJzEzJywKICAgICk7Cgo9Y3V0CgpzdWIgVmFjYXRpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWNhdGlvbk5hbWUgPSAnJzsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcwogICAgVElNRVNDQUxFOgogICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICBuZXh0IFRJTUVTQ0FMRSBpZiAkUGFyYW17JF99OwoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlZhY2F0aW9uQ2hlY2s6IE5lZWQgJF8hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbXkgJFllYXIgID0gJFBhcmFte1llYXJ9OwogICAgbXkgJE1vbnRoID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICBteSAkRGF5ICAgPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtEYXl9ICk7CgogICAgaWYgKCBkZWZpbmVkKCAkU2VsZi0+e1RpbWVWYWNhdGlvbkRheXN9LT57ICRNb250aCB9LT57ICREYXkgfSApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e1RpbWVWYWNhdGlvbkRheXN9LT57ICRNb250aCB9LT57ICREYXkgfTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICBkZWZpbmVkKCAkU2VsZi0+e1RpbWVWYWNhdGlvbkRheXNPbmVUaW1lfS0+eyAkWWVhciB9LT57ICRNb250aCB9LT57ICREYXkgfSApICkKICAgIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntUaW1lVmFjYXRpb25EYXlzT25lVGltZX0tPnsgJFllYXIgfS0+eyAkTW9udGggfS0+eyAkRGF5IH07CiAgICB9CgogICAgJE1vbnRoID0gaW50ICRNb250aDsKICAgICREYXkgICA9IGludCAkRGF5OwogICAgaWYgKCBkZWZpbmVkKCAkU2VsZi0+e1RpbWVWYWNhdGlvbkRheXN9LT57ICRNb250aCB9LT57ICREYXkgfSApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e1RpbWVWYWNhdGlvbkRheXN9LT57ICRNb250aCB9LT57ICREYXkgfTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICBkZWZpbmVkKAogICAgICAgICAgICAkU2VsZi0+e1RpbWVWYWNhdGlvbkRheXNPbmVUaW1lfS0+eyAkWWVhciB9LT57ICRNb250aCB9LT57ICREYXkgfQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57VGltZVZhY2F0aW9uRGF5c09uZVRpbWV9LT57ICRZZWFyIH0tPnsgJE1vbnRoIH0tPnsgJERheSB9OwogICAgfQogICAgcmV0dXJuOwp9Cgo9aXRlbSBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nKCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIGhvdXJzIGRlcGVuZGVudCBwcm9qZWN0IGFuZCBhY3Rpb24gZGF0YQoKICAgIG15ICVQcm9qZWN0RGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICBZZWFyICA9PiAyMDA1LAogICAgICAgIE1vbnRoID0+IDcsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdEFjdGlvblJlcG9ydGluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgICA9ICgpOwogICAgbXkgJElEU2VsZWN0ID0gJyc7CiAgICBmb3IgKHF3KFllYXIgTW9udGgpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fQogICAgICAgICAgICAgICAgLT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIlByb2plY3RBY3Rpb25SZXBvcnRpbmc6IE5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1VzZXJJRH0gKSB8fCAnJzsKICAgICAgICAkSURTZWxlY3QgPSAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyI7CiAgICB9CgogICAgIyBob3VycyBwZXIgbW9udGgKICAgIG15ICREYXRlU3RyaW5nID0gJFBhcmFte1llYXJ9IC4gIi0iIC4gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CgogICAgbXkgJFNRTF9RdWVyeV9UaW1lU3RhcnQgPSAidGltZV9zdGFydCA8PSAnJERhdGVTdHJpbmctMzEgMjM6NTk6NTknJElEU2VsZWN0IjsKCiAgICAjdHRvOiB5ZXMsIEkga25vdyB0aGVyZSBhcmUgc29tZSBub24tbGVhcC15ZWFycywgLi4uCiAgICAjLi4uYnV0IGNvbSdvbiB0aGVzZSBmZXcgZW50cmllcyBpbiB0aGUgZXJyb3IgbG9nIHdvbid0IGJvdGhlciB0b28gbXVjaC4uLiA6LSkKICAgIGlmICggICAoICRQYXJhbXtNb250aH0gPT0gMiApCiAgICAgICAgfHwgKCAkUGFyYW17TW9udGh9ID09IDQgKQogICAgICAgIHx8ICggJFBhcmFte01vbnRofSA9PSA2ICkKICAgICAgICB8fCAoICRQYXJhbXtNb250aH0gPT0gOSApCiAgICAgICAgfHwgKCAkUGFyYW17TW9udGh9ID09IDExICkgKQogICAgewogICAgICAgICRTUUxfUXVlcnlfVGltZVN0YXJ0ID0gInRpbWVfc3RhcnQgPD0gJyREYXRlU3RyaW5nLTMwIDIzOjU5OjU5JyRJRFNlbGVjdCI7CiAgICB9CgogICAgIyBUb3RhbCBob3VycwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PgogICAgICAgICAgICAiU0VMRUNUIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFICRTUUxfUXVlcnlfVGltZVN0YXJ0IiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRhe1RvdGFsfXsgJFJvd1swXSB9eyAkUm93WzFdIH17SG91cnN9ICs9ICRSb3dbMl07CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0KICAgICAgICAtPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIgogICAgICAgICAgICAuICIgV0hFUkUgdGltZV9zdGFydCA+PSAnJERhdGVTdHJpbmctMDEgMDA6MDA6MDAnIEFORCAkU1FMX1F1ZXJ5X1RpbWVTdGFydCIsICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRhe1Blck1vbnRofXsgJFJvd1swXSB9eyAkUm93WzFdIH17SG91cnN9ICs9ICRSb3dbMl07CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cgp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE0ICQgJERhdGU6IDIwMDgvMDcvMjggMTA6MDU6NDMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtIC0gdGhlIGRlIGxhbmd1YWdlIGZvciBBZ2VudFRpbWVBY2NvdW50aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS43IDIwMDgvMDcvMDcgMDY6Mjg6MjggdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9BZ2VudFRpbWVBY2NvdW50aW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259ID0gewogICAgICAgICV7ICRTZWxmLT57VHJhbnNsYXRpb259IH0sCgogICAgICAgICMgVGVtcGxhdGU6IEFnZW50VGltZUFjY291bnRpbmcKICAgICAgICAnU2V0dGluZycgICAgICAgID0+ICdLb25maWd1cmF0aW9uJywKICAgICAgICAnUHJvamVjdFNldHRpbmcnID0+ICdQcm9qZWt0a29uZmlndXJhdGlvbicsCgogICAgICAgICNuZXcgdHJhbnNsYXRpb25zLi4uCiAgICAgICAgJ0RhdGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXR1bScsCiAgICAgICAgJ3VudGlsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdiaXMnLAogICAgICAgICdXb3JraW5nSG91cnMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJiZWl0c3N0dW5kZW4nLAogICAgICAgICdXb3JraW5nIEhvdXJzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJiZWl0c3N0dW5kZW4nLAogICAgICAgICdXZWVrbHkgSG91cnMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnV29jaGVuc3R1bmRlbicsCiAgICAgICAgJ3RoaXMgbW9udGgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdkaWVzZXIgTW9uYXQnLAogICAgICAgICdPdmVydGltZSB0b3RhbCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3VtbWUg3GJlcnN0dW5kZW4nLAogICAgICAgICdMZWF2ZSBEYXlzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVGFnZSBhYndlc2VuZCcsCiAgICAgICAgJ0xlYXZlRGF5IHRoaXMgbW9udGgnICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWJzdGFnZSAoZGllc2VyIE1vbmF0KScsCiAgICAgICAgJ0xlYXZlRGF5VG90YWwnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWJzdGFnZSAoU3VtbWUpJywKICAgICAgICAnTGVhdmVEYXkgcmVtYWluaW5nJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VybGF1YnN0YWdlICh2ZXJibGVpYmVuZCknLAogICAgICAgICdEaXNlYXNlZCB0aGlzIG1vbnRoJyAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QgKGRpZXNlciBNb25hdCknLAogICAgICAgICdEaXNlYXNlZFRvdGFsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QgKFN1bW1lKScsCiAgICAgICAgJ1RpbWVBY2NvdW50aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdaZWl0ZXJmYXNzdW5nJywKICAgICAgICAnVGltZSBBY2NvdW50aW5nIE92ZXJ2aWV3IHBlciBNb250aCcgICAgICAgPT4gJ01vbmF0c/xiZXJzaWNodCBaZWl0ZXJmYXNzdW5nJywKICAgICAgICAnRWRpdCBUaW1lIEFjY291bnRpbmcnICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRlcmZhc3N1bmcgYmVhcmJlaXRlbicsCiAgICAgICAgJ0VkaXQgVGltZSBBY2NvdW50aW5nIFByZWZlcmVuY2UnICAgICAgICAgID0+ICdaZWl0ZXJmYXNzdW5nc2VpbnN0ZWxsdW5nZW4gYmVhcmJlaXRlbicsCiAgICAgICAgJ1VzZXIgUmVwb3J0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOdXR6ZXJiZXJpY2h0ZScsCiAgICAgICAgJ1Byb2plY3QgUmVwb3J0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQcm9qZWt0YmVyaWNodGUnLAogICAgICAgICdUaW1lIFByZXBvcnRpbmcnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnWmVpdGJlcmljaHRlJywKICAgICAgICAnTGVhdmVEYXkgUmVtYWluaW5nJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1ZlcmJsZWliZW5kZSBVcmxhdWJzdGFnZScsCiAgICAgICAgJ3BlciBNb250aCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdwcm8gTW9uYXQnLAogICAgICAgICdIb3VycycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3R1bmRlbicsCiAgICAgICAgJ1RpbWUgc2VsZWN0aW9uJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBdXN3YWhsIERhdHVtJywKICAgICAgICAnSW5jb21wbGV0ZSBEYXlzJyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25pY2h0IGF1c2dlZvxsbHRlIFRhZ2UnLAogICAgICAgICdQcm9qZWN0JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnUHJvamVrdCcsCiAgICAgICAgJ1Byb2plY3RzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQcm9qZWt0ZScsCiAgICAgICAgJ1RvdGFsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdW1tZScsCiAgICAgICAgJ1JlcG9ydGluZycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdCZXJpY2h0c3dlc2VuJywKICAgICAgICAnQWN0aW9uIFNldHRpbmcnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FrdGlvbnNlaW5zdGVsbHVuZ2VuJywKICAgICAgICAnVXNlciBTZXR0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ051dHplcmVpbnN0ZWxsdW5nZW4nLAogICAgICAgICdTaG93IE92ZXJ0aW1lJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4gYW56ZWlnZW4nLAogICAgICAgICdDcmVhdGUgUHJvamVjdCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnUHJvamVrdCBlcnN0ZWxsZW4nLAogICAgICAgICdOZXcgdXNlciBzZXR0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTmV1ZSBOdXR6ZXJlaW5zdGVsbHVuZycsCiAgICAgICAgJ1JlbWFyaycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBbm1lcmt1bmcnLAogICAgICAgICdTdGFydHRpbWUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQmVnaW5uJywKICAgICAgICAnRW5kdGltZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0VuZGUnLAogICAgICAgICdTdGFydGRhdGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF0dW0gQmVnaW5uJywKICAgICAgICAnRW5kZGF0ZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0RhdHVtIEVuZGUnLAogICAgICAgICdQZXJpb2QnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF1ZXInLAogICAgICAgICdMZWF2ZSBEYXknICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXJsYXVic3RhZycsCiAgICAgICAgJ0xlYXZlRGF5JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWInLAogICAgICAgICdEaXNlYXNlZCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QnLAogICAgICAgICdPdmVydGltZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4nLAogICAgICAgICdUb3RhbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3VtbWUnLAogICAgICAgICdPdmVydmlldyBvZiAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnNpY2h0IC0gJywKICAgICAgICAnVGltZUFjY291bnRpbmcgb2YnICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRlcmZhc3N1bmcgdm9tJywKICAgICAgICAnU3VjY2Vzc2Z1bCBpbnNlcnQhJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0VyZm9sZ3JlaWNoIGVpbmdlZvxndCEnLAogICAgICAgICdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0JyA9PiAnV29sbGVuIFNpZSBkaWVzZW4gRWludHJhZyB3aXJrbGljaCBs9nNjaGVuJywKICAgICAgICAnQ2FuXCd0IGluc2VydCBXb3JraW5nIFVuaXRzIScgICAgICAgICAgICAgPT4gJ0thbm4gQXJiZWl0c3N0dW5kZW4gbmljaHQgZWluZvxnZW4hJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBBY3Rpb24hJyA9PiAnTmljaHQgc3BlaWNoZXJiYXIgLSBBa3Rpb24gZmVobHQhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBQcm9qZWN0IScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gUHJvamVrdGFuZ2FiZSBmZWhsdCEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSB0aGUgUGVyaW9kIGlzIGJpZ2dlciB0aGFuIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIFN0YXJ0dGltZSBhbmQgRW5kdGltZSEnCiAgICAgICAgICAgID0+ICdOaWNodCBzcGVpY2hlcmJhciAtIERhdWVyIGlzdCBncvbfZXIgYWxzIGRlciBaZWl0cmF1bSB6d2lzY2hlbiBCZWdpbm4gdW5kIEVuZGUhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgU3RhcnR0aW1lIGlzIG9sZGVyIHRoYW4gRW5kdGltZSEnID0+CiAgICAgICAgICAgICdOaWNodCBzcGVpY2hlcmJhciAtIEJlZ2lubiBsaWVndCBuYWNoIEVuZGUhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwZXJpb2QhJyA9PgogICAgICAgICAgICAnTmljaHQgc3BlaWNoZXJiYXIgLSBEYXVlciAoZXJnaWJ0IHNpY2ggYXVzIFN0YXJ0LSB1bmQgRW5kemVpdCkgaXN0IG5pY2h0IGFuZ2VnZWJlbiEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBQZXJpb2QgaXMgbm90IGdpdmVuIGdpdmVuIScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gRGF1ZXIgKGVyZ2lidCBzaWNoIGF1cyBTdGFydC0gdW5kIEVuZHplaXQpIGlzdCBuaWNodCBhbmdlZ2ViZW4hJywKICAgICAgICAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IGFyZSBEaXNlYXNlZD8nID0+CiAgICAgICAgICAgICdTaWUgd2FyZW4ga3JhbmsgdW5kIGhhYmVuIGdlYXJiZWl0ZXQ/IFdpciBicmF1Y2hlbiBtZWhyIHNvbGNoZSBNaXRhcmJlaXRlci4nLAogICAgICAgICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3UgaGF2ZSBhIGxlYXZlIGRheT8nID0+CiAgICAgICAgICAgICdTaWUgaGF0dGVuIFVybGF1YiB1bmQgaGFiZW4gZ2VhcmJlaXRldD8gV2lyIGJyYXVjaGVuIG1laHIgc29sY2hlIE1pdGFyYmVpdGVyLicsCiAgICAgICAgJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSBoYXZlIG92ZXJ0aW1lPycgPT4KICAgICAgICAgICAgJ0hhYmVuIFNpZSB35GhyZW5kIGRlciDcYmVyc3R1bmRlbiBhdWNoIGdlYXJiZWl0ZXQ/JywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgYSBkYXkgaGFzIG9ubHkgMjQgaG91cnMhJyA9PiAnRWluIFRhZyBoYXQgbnVyIDI0IFN0dW5kZW4hJywKICAgICAgICAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScgICAgICA9PiAnS2FubiBBcmJlaXRzc3R1bmRlbiBuaWNodCBs9nNjaGVuIScsCiAgICAgICAgJ1BsZWFzZSBpbnNlcnQgeW91ciB3b3JraW5nIGhvdXJzIScgPT4gJ0JpdHRlIHRyYWdlbiBTaWUgSWhyZSBBcmJlaXRzemVpdGVuIGVpbiEnLAogICAgICAgICdZb3UgaGF2ZSB0byBpbnNlcnQgU3RhcnQtIGFuZCBFbmR0aW1lIG9yIGEgUGVyaW9kJyA9PgogICAgICAgICAgICAnU2llIG38c3NlbiBCZWdpbm4tIHVuZCBFbmRlemVpdCBhbmdlYmVuLicsCiAgICAgICAgJ1lvdSBjYW4gb25seSBzZWxlY3Qgb25lIGNoZWNrYm94IGVsZW1lbnQhJyA9PiAnU2llIGv2bm5lbiBudXIgZWluZSBDaGVja2JveCBtYXJraWVyZW4hJywKICAgICAgICAnRWRpdCBUaW1lIEFjY291bnRpbmcgUHJvamVjdCBQcmVmZXJlbmNlJyA9PgogICAgICAgICAgICAnWmVpdGVyZmFzc3VuZzogQmVhcmJlaXR1bmcgZGVyIFByb2pla3Rrb25maWd1cmF0aW9uJywKICAgICAgICAnUHJvamVjdCBTZXR0aW5nJyA9PiAnUHJvamVrdGtvbmZpZ3VyYXRpb24nLAogICAgICAgICcnICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICdJZiB5b3UgdXNlIGFjdGlvbiBtaXNjLCBwbGVhc2UgZ2l2ZSBhbiBleHBsYW5hdGlvbiBpbiB0aGUgZmllbGQgcmVtYXJrJyA9PgogICAgICAgICAgICAnV2VubiBTaWUgQWt0aW9uIFNvbnN0aWdlcyBhdXN35GhsZW4sIGdlYmVuIFNpZSBlaW5lIEJlc2NocmVpYnVuZyB1bSBGZWxkIEFubWVya3VuZyBhbi4nLAoKICAgICAgICAjIEZJWE1FIGFjdHVhbGx5IHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGZpbGUgZGUucG0sIGhvd2V2ZXIgdGhleSdyZSBub3Qgc28gSSBwdXQnZW0gaGVyZS4uLgogICAgICAgICdNb24nICAgICAgPT4gJ01vJywKICAgICAgICAnVHVlJyAgICAgID0+ICdEaScsCiAgICAgICAgJ1dlZCcgICAgICA9PiAnTWknLAogICAgICAgICdUaHUnICAgICAgPT4gJ0RvJywKICAgICAgICAnRnJpJyAgICAgID0+ICdGcicsCiAgICAgICAgJ1NhdCcgICAgICA9PiAnU2EnLAogICAgICAgICdTdW4nICAgICAgPT4gJ1NvJywKICAgICAgICAnSmFudWFyeScgID0+ICdKYW51YXInLAogICAgICAgICdGZWJydWFyeScgPT4gJ0ZlYnJ1YXInLAogICAgICAgICdNYXJjaCcgICAgPT4gJ03kcnonLAogICAgICAgICdNYXknICAgICAgPT4gJ01haScsCiAgICAgICAgJ0p1bmUnICAgICA9PiAnSnVuaScsCiAgICAgICAgJ0p1bHknICAgICA9PiAnSnVsaScsCiAgICAgICAgJ09jdG9iZXInICA9PiAnT2t0b2JlcicsCiAgICAgICAgJ0RlY2VtYmVyJyA9PiAnRGV6ZW1iZXInLAogICAgfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGltZUFjY291bnRpbmcucG0gLSB0aW1lIGFjY291bnRpbmcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS4yMSAyMDA4LzA3LzI4IDEwOjA0OjI1IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpbWVBY2NvdW50aW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZzsKdXNlIERhdGU6OlBjYWxjIHF3KFRvZGF5IERheXNfaW5fTW9udGggRGF5X29mX1dlZWsgQWRkX0RlbHRhX1lNRCk7CnVzZSBUaW1lOjpMb2NhbDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7ICVQYXJhbSB9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIE9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgTW9kdWxlUmVnIExvZ09iamVjdAogICAgICAgIENvbmZpZ09iamVjdCBUaWNrZXRPYmplY3QgVGltZU9iamVjdCBHcm91cE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApIGlmICEkU2VsZi0+eyRffTsKICAgIH0KCiAgICAjIGNyZWF0ZSByZXF1aXJlZCBvYmplY3RzLi4uCiAgICAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KCVQYXJhbSk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgIHJldHVybiAxIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkgKTsKCiAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkVXNlcnsgJFNlbGYtPntVc2VySUR9fTsKCiAgICBteSAlSW5jb21wbGV0ZVdvcmtpbmdEYXlzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKTsKCiAgICAjIHJlZGlyZWN0IGlmIGluY29tcGxldGUgd29ya2luZyBkYXkgYXJlIG91dCBvZiByYW5nZQogICAgaWYgKCAgICRJbmNvbXBsZXRlV29ya2luZ0RheXN7RW5mb3JjZUluc2VydH0KICAgICAgICAmJiAkU2VsZi0+e0FjdGlvbn0gbmUgJ0FnZW50VGltZUFjY291bnRpbmcnCiAgICAgICAgJiYgJFNlbGYtPntBY3Rpb259IG5lICdBZ2VudENhbGVuZGFyU21hbGwnICkKICAgIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gJ0FjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJlN1YmFjdGlvbj1FZGl0JwogICAgICAgICk7CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATW9udGhBcnJheSA9ICgKICAgICAgICAnJywgICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgICAgICdBcHJpbCcsICAgJ01heScsCiAgICAgICAgJ0p1bmUnLCAnSnVseScsICAgICdBdWd1c3QnLCAgICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsCiAgICAgICAgJ0RlY2VtYmVyJywKICAgICk7CiAgICBteSBAV2Vla2RheUFycmF5ID0gKCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnLCAnU3VuJywgKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBlZGl0IHRoZSB0aW1lIGFjY291bnRpbmcgZWxlbWVudHMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdCcgKSB7CiAgICAgICAgbXkgJE91dHB1dCAgICAgID0gJyc7CiAgICAgICAgbXkgJUZyb250ZW5kICAgID0gKCk7CiAgICAgICAgbXkgJVByb2plY3RMaXN0ID0gKCk7CiAgICAgICAgbXkgJUFjdGlvbkxpc3QgID0gKCk7CiAgICAgICAgbXkgJURhdGEgICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFjdGlvbiAgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fQogICAgICAgICAgICAtPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksICk7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciAocXcoU3RhdHVzIFllYXIgTW9udGggRGF5IERlbGV0ZSkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9IHx8ICEkUGFyYW17RGF5fSApIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9ICRZZWFyOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gJE1vbnRoOwogICAgICAgICAgICAkUGFyYW17RGF5fSAgID0gJERheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtZZWFyfSApOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgICAgICRQYXJhbXtEYXl9ICAgPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtEYXl9ICk7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApOwoKICAgICAgICAjIGZvciBpbml0aWFsIHVzZWluZywgdGhlIGZpcnN0IGFnZW50IHdpdGggcnctcmlnaHQgd2lsbCBiZSByZWRpcmVjdGVkCiAgICAgICAgIyB0byAnU2V0dGluZycuIFRoZW4gaGUgY2FuIGRvIHRoZSBpbml0aWFsIHNldHRpbmdzCiAgICAgICAgaWYgKCAhJFVzZXJ7ICRTZWxmLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICBteSAlR3JvdXBMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoICgga2V5cyAlR3JvdXBMaXN0ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRHcm91cExpc3R7JF99IGVxICd0aW1lX2FjY291bnRpbmcnICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJiIgLiAiU3ViYWN0aW9uPVNldHRpbmciICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiTm8gVXNlclBlcmlvZCBhdmFpbGFibGUsIHBsZWFzZSBjb250YWN0IHRoZSB0aW1lIGFjY291bnRpbmcgYWRtaW4gdG8gaW5zZXJ0IHlvdXIgVXNlclBlcmlvZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlSW5jb21wbGV0ZVdvcmtpbmdEYXlzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKTsKICAgICAgICBteSAkTWF4QWxsb3dlZEluc2VydERheXMKICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6Ok1heEFsbG93ZWRJbnNlcnREYXlzJykgfHwgJzEwJzsKICAgICAgICAoICRQYXJhbXtZZWFyQWxsb3dlZH0sICRQYXJhbXtNb250aEFsbG93ZWR9LCAkUGFyYW17RGF5QWxsb3dlZH0gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRZZWFyLCAkTW9udGgsICREYXksIDAsIDAsIC0kTWF4QWxsb3dlZEluc2VydERheXMgKTsKICAgICAgICBpZiAodGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKSA8IHRpbWVsb2NhbCgKICAgICAgICAgICAgICAgIDEsIDAsIDAsICRQYXJhbXtEYXlBbGxvd2VkfSwKICAgICAgICAgICAgICAgICRQYXJhbXtNb250aEFsbG93ZWR9IC0gMSwKICAgICAgICAgICAgICAgICRQYXJhbXtZZWFyQWxsb3dlZH0gLSAxOTAwCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAhJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXsgJFBhcmFte1llYXJ9IH17ICRQYXJhbXtNb250aH0gfQogICAgICAgICAgICAgICAgeyAkUGFyYW17RGF5fSB9ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1WaWV3JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0mRGF5PSRQYXJhbXtEYXl9IgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FZGl0JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0mRGF5PSRQYXJhbXtEYXl9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICAoICRQYXJhbXtZZWFyQmFja30sICRQYXJhbXtNb250aEJhY2t9LCAkUGFyYW17RGF5QmFja30gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIC0xICk7CiAgICAgICAgKCAkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAxICk7CgogICAgICAgICMgRWRpdCBXb3JraW5nIFVuaXRzCiAgICAgICAgaWYgKCAkUGFyYW17U3RhdHVzfSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17RGVsZXRlfSApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJEZWxldGUiICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ0RlbGV0ZScKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkV29ya2luZ1VuaXRJRCA9IDA7CiAgICAgICAgICAgIGZvciAoICRXb3JraW5nVW5pdElEID0gMTsgJFdvcmtpbmdVbml0SUQgPCAxMDsgJFdvcmtpbmdVbml0SUQrKyApIHsKICAgICAgICAgICAgICAgIGZvciAocXcoUHJvamVjdElEIEFjdGlvbklEIFJlbWFyayBTdGFydFRpbWUgRW5kVGltZSBQZXJpb2QpKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfIC4gJ1snIC4gJFdvcmtpbmdVbml0SUQgLiAnXScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1Byb2plY3RJRH0gfHwgJFBhcmFte0FjdGlvbklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSA9ICRQYXJhbXtQcm9qZWN0SUR9OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gID0gJFBhcmFte0FjdGlvbklEfTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UmVtYXJrfSAgICA9ICRQYXJhbXtSZW1hcmt9OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtTdGFydFRpbWV9ID0gJFBhcmFte1N0YXJ0VGltZX07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9ICAgPSAkUGFyYW17RW5kVGltZX07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0RhdGV9ICAgICAgPSAkUGFyYW17RGF0ZX07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17UGVyaW9kfSA9fiAvXihcZCspLChcZCspLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPSAkMSAuICIuIiAuICQyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPSAkUGFyYW17UGVyaW9kfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICVSZWR1Y2VUaW1lID0gKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OlJlZHVjZVRpbWUnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJVJlZHVjZVRpbWUgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OlJlZHVjZVRpbWUnKSB9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgI2lmICgkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gJiYgISRQYXJhbXtQZXJpb2R9KSB7CiAgICAgICAgICAgICAgICAgICAgI292ZXJ3cml0ZSBQZXJpb2Qgd2hlbiBTdGFydCBhbmQgRW5kdGltZSBpcyBnaXZlbi4uLgogICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICQxICogNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0VuZFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJDEgKiA2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFJlZHVjZVRpbWV7ICRBY3Rpb257ICRQYXJhbXtBY3Rpb25JRH0gfXtBY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gKCAkRW5kVGltZSAtICRTdGFydFRpbWUgKSAvIDYwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICRSZWR1Y2VUaW1leyAkQWN0aW9ueyAkUGFyYW17QWN0aW9uSUR9IH17QWN0aW9ufSB9IC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPSAoICRFbmRUaW1lIC0gJFN0YXJ0VGltZSApIC8gNjA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDaGVja2JveENoZWNrID0gMDsKICAgICAgICAgICAgZm9yIChxdyhMZWF2ZURheSBEaXNlYXNlZCBPdmVydGltZSkpIHsKICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdVbml0SUQrKzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSA9ICctMSc7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSAgPSAkUGFyYW17JF99OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtSZW1hcmt9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17RW5kVGltZX0gICA9ICcnOwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrYm94Q2hlY2srKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDaGVja2JveENoZWNrID4gMSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdZb3UgY2FuIG9ubHkgc2VsZWN0IG9uZSBjaGVja2JveCBlbGVtZW50ISc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICREYXRhe1llYXJ9ICA9ICRQYXJhbXtZZWFyfTsKICAgICAgICAgICAgJERhdGF7TW9udGh9ID0gJFBhcmFte01vbnRofTsKICAgICAgICAgICAgJERhdGF7RGF5fSAgID0gJFBhcmFte0RheX07CgogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzSW5zZXJ0KCVEYXRhKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IFdvcmtpbmcgVW5pdHMhJyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17U3VjY2Vzc2Z1bEluc2VydH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBTaG93IFdvcmtpbmcgVW5pdHMKICAgICAgICAjIGdldCBleGlzdGluZyB3b3JraW5nIHVuaXRzCiAgICAgICAgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpJbnB1dEhvdXJzV2l0aG91dFN0YXJ0RW5kVGltZScpICkgewogICAgICAgICAgICAkUGFyYW17VGV4dFBvc2l0aW9ufSAgPSAnbGVmdCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0SW5wdXRQZXJpb2QnOwogICAgICAgICAgICAkRnJvbnRlbmR7Q2xhc3NUaW1lfSAgPSAnZm9vdG5vdGUnOwogICAgICAgICAgICAkRnJvbnRlbmR7UGVyaW9kTm90ZX0gPSAnKic7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGb290Tm90ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtUZXh0UG9zaXRpb259ICA9ICdyaWdodCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0UGVyaW9kV2l0aG91dElucHV0JzsKICAgICAgICAgICAgJEZyb250ZW5ke0NsYXNzVGltZX0gID0gJ3JlcXVpcmVkJzsKICAgICAgICAgICAgJEZyb250ZW5ke1BlcmlvZE5vdGV9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcm9qZWN0IHNldHRpbmdzCiAgICAgICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKCBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0gKSB7CiAgICAgICAgICAgIGlmICggJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0gKSB7CiAgICAgICAgICAgICAgICAkUHJvamVjdExpc3R7JFByb2plY3RJRH0gPSAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUHJvamVjdExpc3R7Jyd9ID0gJyc7CgogICAgICAgICMgZ2V0IGFjdGlvbiBzZXR0aW5ncwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICVBY3Rpb24gKSB7CiAgICAgICAgICAgIGlmICggJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30gKSB7CiAgICAgICAgICAgICAgICAkQWN0aW9uTGlzdHskQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJEFjdGlvbkxpc3R7Jyd9ID0gJyc7CgogICAgICAgIGlmICggdGltZSgpID4gdGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRCbG9jaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgdW5pdHMKICAgICAgICBteSAkV29ya2luZ1VuaXRJRE1heCA9IDEwOwogICAgICAgIG15ICRXb3JraW5nVW5pdElEICAgID0gMDsKICAgICAgICAkUGFyYW17VG90YWx9ID0gMDsKICAgICAgICBmb3IgKCAkV29ya2luZ1VuaXRJRCA9IDE7ICRXb3JraW5nVW5pdElEIDwgJFdvcmtpbmdVbml0SURNYXg7ICRXb3JraW5nVW5pdElEKysgKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gPT0gLTEgKSB7CiAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gPT0gLTEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0Rpc2Vhc2VkfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSA9PSAtMiApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TGVhdmVEYXl9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ID09IC0zICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkV29ya2luZ1VuaXRJRE1heCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte0lEfSA9ICRXb3JraW5nVW5pdElEOwoKICAgICAgICAgICAgICAgICMgZ2V0IG9wdGlvbiBmaWVsZHMKICAgICAgICAgICAgICAgICRGcm9udGVuZHtBY3Rpb25PcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgID0+IFwlQWN0aW9uTGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgICAgICAgID0+ICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAiQWN0aW9uSURbJFdvcmtpbmdVbml0SURdIiwKICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEZyb250ZW5ke1Byb2plY3RPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgID0+IFwlUHJvamVjdExpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgICAgICA9PiAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICJQcm9qZWN0SURbJFdvcmtpbmdVbml0SURdIiwKICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJhbXtSZW1hcmt9ID0gJERhdGF7JFdvcmtpbmdVbml0SUR9e1JlbWFya30gfHwgJyc7CiAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ICYmICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA+IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGVyaW9kfSA9ICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RvdGFsfSArPSAkUGFyYW17UGVyaW9kfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgUGVyaW9kIGlzIG5vdCBnaXZlbiBnaXZlbiEnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBTdGFydHRpbWUgaXMgb2xkZXIgdGhhbiBFbmR0aW1lISc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQZXJpb2R9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgcGVyaW9kISc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BlcmlvZH0gICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17U3RhcnRUaW1lfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtFbmRUaW1lfSAgID0gJyc7CiAgICAgICAgICAgICAgICB9CgojICAgICAgICAgICAgICAgIGZvcmVhY2ggKHF3KFN0YXJ0IEVuZCkpIHsKIyAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXskXyAuICJUaW1lIn0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9eyRfIC4gIlRpbWUifSBlcSAnMDA6MDA6MDAnKSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF8gLiAiSG91ciJ9ID0gJzAwJzsKIyAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXskXyAuICJNaW51dGUifSA9ICcwMCc7CiMgICAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXskXyAuICJUaW1lIn0pIHsKIyAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXskXy4gIkhvdXIifSAgID0gc3Vic3RyKCREYXRheyRXb3JraW5nVW5pdElEfXskX30sIDAsIDIpIHx8ICcnOwojICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRfLiAiTWludXRlIn0gPSBzdWJzdHIoJERhdGF7JFdvcmtpbmdVbml0SUR9eyRffSwgMywgMikgfHwgJyc7CiMgICAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRfIC4gIlRpbWUifSA9IEJ1aWxkVGltZVNlbGVjdGlvbigKIyAgICAgICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAkUGFyYW17JF8uICJIb3VyIn0sCiMgICAgICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gJFBhcmFteyRfLiAiTWludXRlIn0KIyAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAkXywKIyAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCA9PiAnVGltZUlucHV0Rm9ybWF0JywKIyAgICAgICAgICAgICAgICAgICAgKTsKIyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9eyRffSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17JF99IGVxICcwMDowMCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAkRGF0YXskV29ya2luZ1VuaXRJRH17JF99OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte1BlcmlvZEJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBWYWxpZGl0eSBjaGVja3Mgc3RhcnQKICAgICAgICAgICAgICAgIGlmICggICAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfQogICAgICAgICAgICAgICAgICAgICYmICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0KICAgICAgICAgICAgICAgICAgICAmJiAkUGFyYW17RGlzZWFzZWR9ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IGFyZSBEaXNlYXNlZD8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfQogICAgICAgICAgICAgICAgICAgICYmICRQYXJhbXtMZWF2ZURheX0gKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICA9ICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3UgaGF2ZSBhIGxlYXZlIGRheT8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfQogICAgICAgICAgICAgICAgICAgICYmICRQYXJhbXtPdmVydGltZX0gKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICA9ICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3UgaGF2ZSBvdmVydGltZT8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAhJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgQWN0aW9uISc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBQcm9qZWN0ISc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0KICAgICAgICAgICAgICAgICAgICAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSBuZSAnMDA6MDAnCiAgICAgICAgICAgICAgICAgICAgJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9CiAgICAgICAgICAgICAgICAgICAgJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9IG5lICcwMDowMCcgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkMSAqIDYwICsgJDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkMSAqIDYwICsgJDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAoICRFbmRUaW1lIC0gJFN0YXJ0VGltZSApIC8gNjAgKyAwLjAxICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIHRoZSBQZXJpb2QgaXMgYmlnZ2VyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcgdGhhbiB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBTdGFydHRpbWUgYW5kIEVuZHRpbWUhJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPiA2MCAqIDI0IHx8ICRTdGFydFRpbWUgPiA2MCAqIDI0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgYSBkYXkgaGFzIG9ubHkgMjQgaG91cnMhJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IERlc2NyaXB0aW9uID0+ICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdDYW5cJ3QgZGVsZXRlIFdvcmtpbmcgVW5pdHMhJyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259ICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvblRydWV9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0UmVhZG9ubHknLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgRGVzY3JpcHRpb24gPT4gJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgVmFsaWRpdHkgY2hlY2tzIGVuZAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICA+IHRpbWVsb2NhbCggMSwgMCwgMCwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwICkgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsfSApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHZhbGlkaXR5IGNoZWNrcyBzdGFydAogICAgICAgIGlmICggJFBhcmFte1RvdGFsfSAmJiAkUGFyYW17VG90YWx9ID4gMjQgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbW9yZSB0aGFuIDI0IHdvcmtpbmcgaG91cnMhJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17VG90YWx9ICYmICRQYXJhbXtUb3RhbH0gPiAxNiApIHsKICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259ID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIG1vcmUgdGhhbiAxNiBob3Vycz8nOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBEZXNjcmlwdGlvbiA9PiAkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlYWRvbmx5JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBEZXNjcmlwdGlvbiA9PiAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdmFsaWRpdHkgY2hlY2tzIGVuZAoKICAgICAgICAkUGFyYW17RGF0ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gJycsCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICApOwoKICAgICAgICBpZiAodGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKSA8IHRpbWVsb2NhbCgKICAgICAgICAgICAgICAgIDEsIDAsIDAsICRQYXJhbXtEYXlBbGxvd2VkfSwKICAgICAgICAgICAgICAgICRQYXJhbXtNb250aEFsbG93ZWR9IC0gMSwKICAgICAgICAgICAgICAgICRQYXJhbXtZZWFyQWxsb3dlZH0gLSAxOTAwCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyAkUGFyYW17WWVhcn0gfXsgJFBhcmFte01vbnRofSB9eyAkUGFyYW17RGF5fSB9CiAgICAgICAgICAgICAgICAmJiAhJFBhcmFte1N1Y2Nlc3NmdWxJbnNlcnR9ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBEYXRlIGlzIG91dCBvZiBsaW1pdCwgYnV0IHlvdSBoYXZlblwndCBpbnNlcnQgdGhpcyBkYXkgeWV0LCBzbyB5b3UgZ2V0IG9uZSghKSBjaGFuY2UgdG8gaW5zZXJ0JwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciBteSAkWWVhcklEICggc29ydCBrZXlzICV7ICRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRNb250aElEICggc29ydCBrZXlzICV7ICRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX17JFllYXJJRH0gfSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkRGF5SUQgKAogICAgICAgICAgICAgICAgICAgIHNvcnQga2V5cyAleyAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyRZZWFySUR9eyRNb250aElEfSB9ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17SW5jb21wbGV0ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0luY29tcGxldGVUZXh0JywgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJEJvbGRTdGFydCA9ICcnOwogICAgICAgICAgICAgICAgICAgIG15ICRCb2xkRW5kICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICAgJFllYXJJRCBlcSAkUGFyYW17WWVhcn0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJE1vbnRoSUQgZXEgJFBhcmFte01vbnRofQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkRGF5SUQgICBlcSAkUGFyYW17RGF5fSApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQm9sZFN0YXJ0ID0gJzxiPic7CiAgICAgICAgICAgICAgICAgICAgICAgICRCb2xkRW5kICAgPSAnPC9iPic7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmNvbXBsZXRlV29ya2luZ0RheXMnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgICAgICA9PiAkWWVhcklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggICAgID0+ICRNb250aElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgICAgID0+ICREYXlJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGRTdGFydCA9PiAkQm9sZFN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZEVuZCAgID0+ICRCb2xkRW5kLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0luY29tcGxldGV9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17V2Vla2RheX0gPSBEYXlfb2ZfV2VlayggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApOwogICAgICAgIGlmICggJFBhcmFte1dlZWtkYXl9ICE9IDYgJiYgJFBhcmFte1dlZWtkYXl9ICE9IDcgJiYgISRWYWNhdGlvbkNoZWNrICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3RoZXJUaW1lcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtXZWVrZGF5X3RvX1RleHR9ID0gJFdlZWtkYXlBcnJheVsgJFBhcmFte1dlZWtkYXl9IC0gMSBdOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ0VkaXQnICk7CiAgICAgICAgaWYgKCAhJEluY29tcGxldGVXb3JraW5nRGF5c3tFbmZvcmNlSW5zZXJ0fSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGNyZWF0ZSBwcm9qZWN0IGxpbmssIGlmIGFsbG93ZWQKICAgICAgICAgICAgbXkgJVVzZXJCYXNpY3MgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgpOwogICAgICAgICAgICBpZiAoICRVc2VyQmFzaWNzeyAkU2VsZi0+e1VzZXJJRH0gfXtDcmVhdGVQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0NyZWF0ZVByb2plY3QnLCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggICAhJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICYmICEkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb25UcnVlfQogICAgICAgICAgICAmJiAkUGFyYW17U3VjY2Vzc2Z1bEluc2VydH0gKQogICAgICAgIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSggSW5mbyA9PiAnU3VjY2Vzc2Z1bCBpbnNlcnQhJywgKTsKICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nRWRpdCcKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB2aWV3IG9sZGVyIGRheSBpbnN0ZXJ0cwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdWaWV3JyApIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgKHF3KERheSBNb250aCBZZWFyIFVzZXJJRCkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgICAgIGZvciAocXcoRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAiVmlldzogTmVlZCAkXyIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBVc2VySUQgcG9zdGVkIHVzZSB0aGUgY3VycmVudCB1c2VyCiAgICAgICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSBuYW1pbmcgb2YgdGhlIGFnZW50IHdoaWNoIHRpbWUgYWNjb3VudGluZyBpcyB2aXNpdGVkCiAgICAgICAgaWYgKCAkUGFyYW17VXNlcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAxICk7CiAgICAgICAgICAgICRQYXJhbXtVc2VyfSA9ICRTaG93blVzZXJzeyAkUGFyYW17VXNlcklEfSB9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1dlZWtkYXl9ICAgICAgICAgPSBEYXlfb2ZfV2VlayggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApOwogICAgICAgICRQYXJhbXtXZWVrZGF5X3RvX1RleHR9ID0gJFdlZWtkYXlBcnJheVsgJFBhcmFte1dlZWtkYXl9IC0gMSBdOwogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSAgID0gJE1vbnRoQXJyYXlbICRQYXJhbXtNb250aH0gXTsKCiAgICAgICAgIyBWYWx1ZXMgZm9yIHRoZSBsaW5rIGljb25zIDw+CiAgICAgICAgKCAkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAtMSApOwogICAgICAgICggJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgMSApOwoKICAgICAgICAkUGFyYW17RGF0ZVNlbGVjdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gJycsCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICApOwoKICAgICAgICAjIFNob3cgV29ya2luZyBVbml0cwogICAgICAgICMgZ2V0IGV4aXN0aW5nIHdvcmtpbmcgdW5pdHMKICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17RGF0ZX0gPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CgogICAgICAgICMgZ2V0IHByb2plY3QgYW5kIGFjdGlvbiBzZXR0aW5ncwogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJEZsYWcgICAgPSAwOwogICAgICAgIGZvciBteSAkSUQgKCBrZXlzICVEYXRhICkgewogICAgICAgICAgICBpZiAoICREYXRheyRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskSUR9e1Byb2plY3RJRH0gPT0gLTEgKSB7CiAgICAgICAgICAgICAgICBpZiAoICREYXRheyRJRH17QWN0aW9uSUR9ID09IC0xICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEaXNlYXNlZH0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICREYXRheyRJRH17QWN0aW9uSUR9ID09IC0yICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtMZWF2ZURheX0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICREYXRheyRJRH17QWN0aW9uSUR9ID09IC0zICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoICEkRmxhZyApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdVbml0QmxvY2snLCApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgICA9PiAkUHJvamVjdHtQcm9qZWN0fXsgJERhdGF7JElEfXtQcm9qZWN0SUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICA9PiAkQWN0aW9ueyAkRGF0YXskSUR9e0FjdGlvbklEfSB9e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFyayAgICA9PiAkRGF0YXskSUR9e1JlbWFya30sCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkRGF0YXskSUR9e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkRGF0YXskSUR9e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2QgICAgPT4gJERhdGF7JElEfXtQZXJpb2R9LAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRmxhZyA9IDE7CiAgICAgICAgICAgICAgICAkUGFyYW17VG90YWx9ICs9ICREYXRheyRJRH17UGVyaW9kfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJEZsYWcpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RvdGFsJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBUb3RhbCA9PiBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbH0gKSB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte0Rpc2Vhc2VkfSB8fCAkUGFyYW17TGVhdmVEYXl9IHx8ICRQYXJhbXtPdmVydGltZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdGhlclRpbWVzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERpc2Vhc2VkID0+ICRQYXJhbXtEaXNlYXNlZH0sCiAgICAgICAgICAgICAgICAgICAgTGVhdmVEYXkgPT4gJFBhcmFte0xlYXZlRGF5fSwKICAgICAgICAgICAgICAgICAgICBPdmVydGltZSA9PiAkUGFyYW17T3ZlcnRpbWV9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFZhY2F0aW9uID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRWYWNhdGlvbikgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmFjYXRpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFZhY2F0aW9uID0+ICRWYWNhdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmVzZW50YXRpb24KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJWaWV3IiApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1ZpZXcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlIG9iamVjdCBmcm9tIGRhdGFiYXNlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScgKSB7CiAgICAgICAgZm9yIChxdyhEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUm99ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FZGl0JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0mRGF5PSRQYXJhbXtEYXl9IgogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcgYWJvdXQgdGhlIHVzZXJzIHRpbWUgYWNjb3VudGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdPdmVydmlldycgKSB7CiAgICAgICAgbXkgJE91dHB1dCAgID0gJyc7CiAgICAgICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0KICAgICAgICAgICAgLT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLCApOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1JvfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgICAgIGZvciAocXcoU3RhdHVzIERheSBNb250aCBZZWFyIFVzZXJJRCBQcm9qZWN0U3RhdHVzU2hvdykpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1N1YmFjdGlvbn0gPSAnRWRpdCc7CgogICAgICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte1VzZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICYmICEkU2VsZi0+e0FjY2Vzc1J3fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtTdWJhY3Rpb259ID0gJ1ZpZXcnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17VXNlcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAxICk7CiAgICAgICAgICAgICRQYXJhbXtVc2VyfSA9ICRTaG93blVzZXJzeyAkUGFyYW17VXNlcklEfSB9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9ICkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0iLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSA9ICRNb250aEFycmF5WyAkUGFyYW17TW9udGh9IF07CgogICAgICAgICggJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAtMSwgMCApOwogICAgICAgICggJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAxLCAwICk7CgogICAgICAgICMgT3ZlcnZpZXcgcGVyIGRheQogICAgICAgIG15ICREYXlzT2ZNb250aCA9IERheXNfaW5fTW9udGgoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSApOwoKICAgICAgICBmb3IgKCBteSAkRGF5ID0gMTsgJERheSA8PSAkRGF5c09mTW9udGg7ICREYXkrKyApIHsKICAgICAgICAgICAgJFBhcmFte0RheX0gPSBzcHJpbnRmKCAiJTAyZCIsICREYXkgKTsKICAgICAgICAgICAgJFBhcmFte1dlZWtkYXl9ID0gRGF5X29mX1dlZWsoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJERheSApIC0gMTsKICAgICAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkUGFyYW17WWVhcn0gZXEgJFllYXIgJiYgJFBhcmFte01vbnRofSBlcSAkTW9udGggJiYgJEN1cnJlbnREYXkgZXEgJERheSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gPSAnYmdjb2xvcj0ib3JhbmdlIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRWYWNhdGlvbkNoZWNrKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U3R5bGV9ICAgPSAnYmdjb2xvcj0iI0VCQ0NDQyInOwogICAgICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJFZhY2F0aW9uQ2hlY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUGFyYW17V2Vla2RheX0gPT0gNiB8fCAkUGFyYW17V2Vla2RheX0gPT0gNSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gPSAnYmdjb2xvcj0iI0ZGRTBFMCInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSIjRTVGMEZGIic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRXb3JraW5nSG91cnMgPSAwOwogICAgICAgICAgICBteSAlT3RoZXJUaW1lICAgID0gKCk7CiAgICAgICAgICAgICRPdGhlclRpbWV7Jy0xJ30gPSAnRGlzZWFzZWQnOwogICAgICAgICAgICAkT3RoZXJUaW1leyctMid9ID0gJ0xlYXZlRGF5JzsKICAgICAgICAgICAgJE90aGVyVGltZXsnLTMnfSA9ICdPdmVydGltZSc7CiAgICAgICAgICAgIGZvciBteSAkSUQgKCBrZXlzICVEYXRhICkgewogICAgICAgICAgICAgICAgJFdvcmtpbmdIb3VycyArPSAkRGF0YXskSUR9e1BlcmlvZH07CiAgICAgICAgICAgICAgICBpZiAoICREYXRheyRJRH17UHJvamVjdElEfSA9PSAtMSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q29tbWVudH0gPSAkT3RoZXJUaW1leyAkRGF0YXskSUR9e0FjdGlvbklEfSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkV29ya2luZ0hvdXJzKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17V29ya2luZ0hvdXJzfSA9IHNwcmludGYoICIlLjJmIiwgJFdvcmtpbmdIb3VycyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1dvcmtpbmdIb3Vyc30gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte1dlZWtkYXlfdG9fVGV4dH0gPSAkV2Vla2RheUFycmF5WyAkUGFyYW17V2Vla2RheX0gXTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17Q29tbWVudH0gPSAnJzsKICAgICAgICB9CgogICAgICAgIG15ICVVc2VyUmVwb3J0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJSZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICApOwogICAgICAgIGZvciAoCiAgICAgICAgICAgIHF3KFRhcmdldFN0YXRlIFRhcmdldFN0YXRlVG90YWwgV29ya2luZ0hvdXJzVG90YWwgV29ya2luZ0hvdXJzCiAgICAgICAgICAgIE92ZXJ0aW1lIE92ZXJ0aW1lVG90YWwgT3ZlcnRpbWVVbnRpbCBMZWF2ZURheSBMZWF2ZURheVRvdGFsCiAgICAgICAgICAgIExlYXZlRGF5UmVtYWluaW5nIERpc2Vhc2VkIERpc2Vhc2VkVG90YWwgRGlzZWFzZWRSZW1haW5pbmcpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggISRVc2VyUmVwb3J0eyAkUGFyYW17VXNlcklEfSB9eyRffSApIHsKICAgICAgICAgICAgICAgICRVc2VyUmVwb3J0eyAkUGFyYW17VXNlcklEfSB9eyRffSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFteyRffSA9IHNwcmludGYoICIlLjJmIiwgJFVzZXJSZXBvcnR7ICRQYXJhbXtVc2VySUR9IH17JF99ICk7CiAgICAgICAgfQoKICAgICAgICAjIFNob3cgT3ZlcnRpbWUgaWYgYWxsb3dlZAogICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoKTsKICAgICAgICBpZiAoICRVc2VyQmFzaWNzeyAkUGFyYW17VXNlcklEfSB9e1Nob3dPdmVydGltZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgT3ZlcnZpZXcgcGVyIHByb2plY3QgYW5kIGFjdGlvbgogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aGUgcmVwb3J0IHNvcnQgYnkgcHJvamVjdHMKICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IHx8ICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ3ZhbGlkJyApIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICdhbGwnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAndmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJUFjdGlvbiAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICBmb3IgbXkgJFByb2plY3RJRCAoCiAgICAgICAgICAgIHNvcnQgeyAkUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifSB9CiAgICAgICAgICAgIGtleXMgJXsgJFByb2plY3R7UHJvamVjdH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoICRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRQcm9qZWN0SUQgbmUgJy0xJyApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgPSAnY29udGVudHZhbHVlJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRQcm9qZWN0e1Byb2plY3RTdGF0dXN9eyRQcm9qZWN0SUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17U3RhdHVzfSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1N0YXR1c30gPSAncGFzc2l2JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJFRvdGFsICAgICAgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICRUb3RhbFRvdGFsID0gMDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAoICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgJiYgISRQYXJhbXtTdGF0dXN9ICkKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnICkKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGFjdGlvbiBzb3J0IHdyYXBwZXIgLSBiZSBjYXJlZnVsIGl0cyBub3Qgc2ltdWxhciB3aXRoIHByb2plY3QhIQogICAgICAgICAgICAgICAgICAgICAgICBteSAlU29ydGVkQWN0aW9ucyA9ICgpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAleyAkUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU29ydGVkQWN0aW9uc3skQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgeyAkU29ydGVkQWN0aW9uc3skYX0gY21wICRTb3J0ZWRBY3Rpb25zeyRifSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVTb3J0ZWRBY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZm9yZWFjaCBteSAkQWN0aW9uSUQgKGtleXMgJXskUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9fSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17SG91cnN9ICA9IHNwcmludGYoICIlLjJmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUHJvamVjdERhdGF7UGVyTW9udGh9eyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9IHx8IDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9IHx8IDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb3RhbCAgICAgICs9ICRQYXJhbXtIb3Vyc307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG90YWxUb3RhbCArPSAkUGFyYW17SG91cnNUb3RhbH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte1Byb2plY3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSAgICAgICAgICAgID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRQcm9qZWN0e1Byb2plY3REZXNjcmlwdGlvbn17JFByb2plY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Jvd1NwYW59Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckJhc2ljc3sgJFNlbGYtPntVc2VySUR9IH17Q3JlYXRlUHJvamVjdH0gKSB7CgogICAgIyBwZXJzb25zIGhvdyBhcmUgYWxsb3dlZCB0byBzZWUgdGhlIGNyZWF0ZSBvYmplY3QgbGluayBhcmUgYWxsb3dlZCB0byBzZWUgdGhlIHByb2plY3QgcmVwb3J0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0ICAgPT4gJFBhcmFte1Byb2plY3R9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RJRCA9PiAkUHJvamVjdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0Tm9MaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBQcm9qZWN0ID0+ICRQYXJhbXtQcm9qZWN0fSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Jvd1NwYW59ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgICAgPSAnY29udGVudGtleSc7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgICA9ICdUb3RhbCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gICAgICA9IHNwcmludGYoICIlLjJmIiwgJFRvdGFsICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFRvdGFsVG90YWwgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgKz0gJFRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSArPSAkVG90YWxUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NsYXNzfSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtUb3RhbEhvdXJzfSApICkgewogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzfSApOwogICAgICAgIH0KICAgICAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICkgKSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJPdmVydmlldyIgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ092ZXJ2aWV3JwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNldHRpbmdzIGZvciBoYW5kbGluZyB0aW1lIGFjY291bnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2V0dGluZycgKSB7CiAgICAgICAgbXkgJE91dHB1dCAgICAgPSAnJzsKICAgICAgICBteSAlRnJvbnRlbmQgICA9ICgpOwogICAgICAgIG15ICVBY3Rpb24gICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXR1c0xpc3QgPSAoKTsKICAgICAgICBteSAlVXNlciAgICAgICA9ICgpOwogICAgICAgIG15ICVEYXRhICAgICAgID0gKCk7CiAgICAgICAgbXkgJVVzZXJCYXNpY3MgPSAoKTsKICAgICAgICBmb3IgKHF3KEFjdGlvbkFjdGlvbiBBY3Rpb25Vc2VyIE5ld0FjdGlvbiBOZXdVc2VyKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnU2V0dGluZycsICk7CgogICAgICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbicsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U2V0dGluZyIsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUGFyYW17QWN0aW9uQWN0aW9ufSB8fCAkUGFyYW17TmV3QWN0aW9ufSApIHsKICAgICAgICAgICAgJUFjdGlvbiA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgICAgICBteSAkQWN0aW9uRW1wdHkgPSAwOwogICAgICAgICAgICBteSAlQWN0aW9uQ2hlY2sgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJUFjdGlvbiApIHsKICAgICAgICAgICAgICAgIGZvciAocXcoQWN0aW9uIEFjdGlvblN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskQWN0aW9uSUR9eyRffQogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkQWN0aW9uSUQgLiAnXScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggISREYXRheyRBY3Rpb25JRH17QWN0aW9ufSApIHsKICAgICAgICAgICAgICAgICAgICAkQWN0aW9uRW1wdHkgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAgICREYXRheyRBY3Rpb25JRH17QWN0aW9ufQogICAgICAgICAgICAgICAgICAgICYmICRBY3Rpb25DaGVja3sgJERhdGF7JEFjdGlvbklEfXtBY3Rpb259IH0KICAgICAgICAgICAgICAgICAgICAmJiAkQWN0aW9uQ2hlY2t7ICREYXRheyRBY3Rpb25JRH17QWN0aW9ufSB9ID09IDEgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnVGhlIGFjdGlvbm5hbWluZyBtdXN0IGJlIHVuaXF1ZSEnICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQWN0aW9uQ2hlY2t7ICREYXRheyRBY3Rpb25JRH17QWN0aW9ufSB9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NVcGRhdGUoJURhdGEpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ0NhblwndCB1cGRhdGUgYWN0aW9uIGRhdGEhJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFBhcmFte05ld0FjdGlvbn0gJiYgISRBY3Rpb25FbXB0eSApIHsKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0luc2VydCgpICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCBhY3Rpb24gZGF0YSEnICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0dldCgpOwogICAgICAgICAgICBteSAlTGFzdFBlcmlvZCA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVVzZXIgKSB7CiAgICAgICAgICAgICAgICAkTGFzdFBlcmlvZHskVXNlcklEfSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBlcmlvZCAoIGtleXMgJXsgJFVzZXJ7JFVzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRMYXN0UGVyaW9keyRVc2VySUR9IDwgJFBlcmlvZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAkUGVyaW9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3VXNlclNldHRpbmdbJyAuICRVc2VySUQgLiAnXScgKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUluc2VydERhdGEgPSAoKTsKICAgICAgICAgICAgICAgICAgICAkSW5zZXJ0RGF0YXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICAkSW5zZXJ0RGF0YXtQZXJpb2R9ID0gJExhc3RQZXJpb2R7JFVzZXJJRH0gKyAxOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb25Vc2VyfSAgPSAndHJ1ZSc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0luc2VydCglSW5zZXJ0RGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgdXNlciBkYXRhIScgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17QWN0aW9uVXNlcn0gfHwgJFBhcmFte05ld1VzZXJ9ICkgewogICAgICAgICAgICAgICAgJVVzZXJCYXNpY3MgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgpOwogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVVc2VyICkgewogICAgICAgICAgICAgICAgICAgIGZvciAocXcoU2hvd092ZXJ0aW1lIENyZWF0ZVByb2plY3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9eyRffQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfIC4gJ1snIC4gJFVzZXJJRCAuICddJyApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJEJyZWFrID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAgICRVc2VyQmFzaWNzeyRVc2VySUR9e0Rlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXNjcmlwdGlvblsnIC4gJFVzZXJJRCAuICddJyApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRCcmVhayA9ICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICREZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc2NyaXB0aW9uWycgLiAkVXNlcklEIC4gJ10nICk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259IC4gJEJyZWFrIC4gJERlc2NyaXB0aW9uOwoKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBlcmlvZCAoIGtleXMgJXsgJFVzZXJ7JFVzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChxdyhXZWVrbHlIb3VycyBMZWF2ZURheXMgVXNlclN0YXR1cyBEYXRlU3RhcnQgRGF0ZUVuZCBPdmVydGltZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9eyRQZXJpb2R9eyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkVXNlcklEIC4gJ11bJyAuICRQZXJpb2QgLiAnXScgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXskUGVyaW9kfXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAkUGVyaW9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NVcGRhdGUoJURhdGEpICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSB1c2VyIGRhdGEhJyApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte05ld1VzZXJ9ICYmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1VzZXJJRCcgKSApIHsKICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICREYXRhe1VzZXJJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdVc2VySUQnICk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7UGVyaW9kfSA9ICcxJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzSW5zZXJ0KCVEYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCB1c2VyIGRhdGEhJyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdCggVmFsaWQgPT4gMSApOwogICAgICAgICAgICAgICAgICAgIG15ICVHcm91cERhdGEgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJERhdGF7VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKCBrZXlzICVHcm91cHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdyb3Vwc3skX30gZXEgJ3RpbWVfYWNjb3VudGluZycgJiYgISRHcm91cERhdGF7JF99ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJERhdGF7VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfaW50byA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydyAgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFNob3cgVGltZUFjY291bnRpbmcgUHJlZmVyZW5jZXMKICAgICAgICAkU3RhdHVzTGlzdHsxfSA9ICd2YWxpZCc7CiAgICAgICAgJFN0YXR1c0xpc3R7MH0gPSAnaW52YWxpZCc7CgogICAgICAgICMgU2hvdyBhY3Rpb24gZGF0YQogICAgICAgICVBY3Rpb24gPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAkQWN0aW9uRW1wdHkgPSAwOwogICAgICAgIG15ICVTb3J0QWN0aW9uICA9ICgpOwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICVBY3Rpb24gKSB7CiAgICAgICAgICAgICRTb3J0QWN0aW9ueyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIHNvcnQgeyAkU29ydEFjdGlvbnskYX0gY21wICRTb3J0QWN0aW9ueyRifSB9IGtleXMgJVNvcnRBY3Rpb24gKSB7CiAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbklEfSA9ICRBY3Rpb25JRDsKCiAgICAgICAgICAgICRGcm9udGVuZHsnU3RhdHVzT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVN0YXR1c0xpc3QsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb25TdGF0dXN9IHx8ICcnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiQWN0aW9uU3RhdHVzWyRQYXJhbXtBY3Rpb25JRH1dIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFNob3cgdXNlciBkYXRhCiAgICAgICAgJVVzZXIgICAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzR2V0KCk7CiAgICAgICAgJVVzZXJCYXNpY3MgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgpOwogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAxICk7CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICBpZiAoICRVc2VyeyRVc2VySUR9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJ9ICAgPSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFVzZXJJRDsKCiAgICAgICAgICAgICAgICBteSAkRGVzY3JpcHRpb24gPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAgICAgICAgICREZXNjcmlwdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICApIC4gIjxicj4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFVzZXJCYXNpY3N7JFVzZXJJRH17U2hvd092ZXJ0aW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAkVXNlckJhc2ljc3skVXNlcklEfXtTaG93T3ZlcnRpbWV9ID0gImNoZWNrZWQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkVXNlckJhc2ljc3skVXNlcklEfXtDcmVhdGVQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAkVXNlckJhc2ljc3skVXNlcklEfXtDcmVhdGVQcm9qZWN0fSA9ICJjaGVja2VkIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVGcm9udGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIFNob3dPdmVydGltZSAgPT4gJFVzZXJCYXNpY3N7JFVzZXJJRH17U2hvd092ZXJ0aW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAkVXNlckJhc2ljc3skVXNlcklEfXtDcmVhdGVQcm9qZWN0fSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBkZWxldGUgJFNob3duVXNlcnN7JFVzZXJJRH07CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBlcmlvZCAoIHNvcnQga2V5cyAleyAkVXNlcnskVXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtXZWVrbHlIb3Vyc30gPSAkVXNlcnskVXNlcklEfXskUGVyaW9kfXtXZWVrbHlIb3Vyc307CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0xlYXZlRGF5c30gICA9ICRVc2VyeyRVc2VySUR9eyRQZXJpb2R9e0xlYXZlRGF5c307CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lfSAgICA9ICRVc2VyeyRVc2VySUR9eyRQZXJpb2R9e092ZXJ0aW1lfTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZVN0YXJ0fSAgID0gJFVzZXJ7JFVzZXJJRH17JFBlcmlvZH17RGF0ZVN0YXJ0fTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZUVuZH0gICAgID0gJFVzZXJ7JFVzZXJJRH17JFBlcmlvZH17RGF0ZUVuZH07CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BlcmlvZH0gICAgICA9ICRQZXJpb2Q7CgogICAgICAgICAgICAgICAgICAgICRGcm9udGVuZHsnU3RhdHVzT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU3RhdHVzTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkVXNlcnskVXNlcklEfXskUGVyaW9kfXtVc2VyU3RhdHVzfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiVXNlclN0YXR1c1skVXNlcklEXVskUGVyaW9kXSIsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUGVyaW9kJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVTaG93blVzZXJzKSB7CiAgICAgICAgICAgICRTaG93blVzZXJzeycnfSAgICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICRGcm9udGVuZHsnTmV3VXNlck9wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gIk5ld1VzZXJJRCIsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOZXdVc2VyT3B0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJTZXR0aW5nIiApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nU2V0dGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXR0aW5ncyBmb3IgaGFuZGxpbmcgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Byb2plY3RTZXR0aW5nJyApIHsKICAgICAgICBteSAkT3V0cHV0ICAgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCAgID0gKCk7CiAgICAgICAgbXkgJVByb2plY3QgICAgPSAoKTsKICAgICAgICBteSAlU3RhdHVzTGlzdCA9ICgpOwogICAgICAgIG15ICVEYXRhICAgICAgID0gKCk7CiAgICAgICAgZm9yIChxdyhBY3Rpb25Qcm9qZWN0IE5ld1Byb2plY3QpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1JvfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdQcm9qZWN0U2V0dGluZycsICk7CgogICAgICAgICMgRWRpdCBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgIGlmICggJFBhcmFte0FjdGlvblByb2plY3R9IHx8ICRQYXJhbXtOZXdQcm9qZWN0fSApIHsKICAgICAgICAgICAgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgICAgIG15ICRQcm9qZWN0RW1wdHkgPSAwOwogICAgICAgICAgICBteSAlUHJvamVjdENoZWNrID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkUHJvamVjdElEICgga2V5cyAleyAkUHJvamVjdHtQcm9qZWN0fSB9ICkgewogICAgICAgICAgICAgICAgZm9yIChxdyhQcm9qZWN0IFByb2plY3RTdGF0dXMgUHJvamVjdERlc2NyaXB0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICREYXRheyRQcm9qZWN0SUR9eyRffQogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkUHJvamVjdElEIC4gJ10nICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAkUHJvamVjdEVtcHR5ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggICAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fQogICAgICAgICAgICAgICAgICAgICYmICRQcm9qZWN0Q2hlY2t7ICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9IH0KICAgICAgICAgICAgICAgICAgICAmJiAkUHJvamVjdENoZWNreyAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSB9ID09IDEgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnVGhlIHByb2plY3RuYW1pbmcgbXVzdCBiZSB1bmlxdWUhJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFByb2plY3RDaGVja3sgJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NVcGRhdGUoJURhdGEpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ0NhblwndCB1cGRhdGUgcHJvamVjdCBkYXRhIScgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtOZXdQcm9qZWN0fSAmJiAhJFByb2plY3RFbXB0eSApIHsKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NJbnNlcnQoKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgcHJvamVjdCBkYXRhIScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBTaG93IFRpbWVBY2NvdW50aW5nIFByZWZlcmVuY2VzCiAgICAgICAgJFN0YXR1c0xpc3R7MX0gPSAndmFsaWQnOwogICAgICAgICRTdGF0dXNMaXN0ezB9ID0gJ2ludmFsaWQnOwoKICAgICAgICAjIFNob3cgcHJvamVjdCBkYXRhCiAgICAgICAgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJFByb2plY3RFbXB0eSA9IDA7CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgICAgICBzb3J0IHsgJFByb2plY3R7UHJvamVjdH17JGF9IGNtcCAkUHJvamVjdHtQcm9qZWN0fXskYn0gfQogICAgICAgICAgICBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSAgICAgICAgICAgID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259ID0gJFByb2plY3R7UHJvamVjdERlc2NyaXB0aW9ufXskUHJvamVjdElEfTsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RJRH0gICAgICAgICAgPSAkUHJvamVjdElEOwoKICAgICAgICAgICAgJEZyb250ZW5keydTdGF0dXNPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU3RhdHVzTGlzdCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJQcm9qZWN0U3RhdHVzWyRQYXJhbXtQcm9qZWN0SUR9XSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAiU2V0dGluZyIgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1NldHRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdSZXBvcnRpbmcnICkgewogICAgICAgIG15ICRPdXRwdXQgICAgID0gJyc7CiAgICAgICAgbXkgJUZyb250ZW5kICAgPSAoKTsKICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KCBUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMCApOwogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICRDdXJyZW50RGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9CiAgICAgICAgICAgIC0+U3lzdGVtVGltZTJEYXRlKCBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgICAgICBmb3IgKHF3KFN0YXR1cyBNb250aCBZZWFyIFByb2plY3RTdGF0dXNTaG93KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9ICkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVJlcG9ydGluZyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICBteSAlTW9udGggPSAoKTsKICAgICAgICBmb3IgKCBteSAkSUQgPSAxOyAkSUQgPD0gMTI7ICRJRCsrICkgewogICAgICAgICAgICAkTW9udGh7IHNwcmludGYoICIlMDJkIiwgJElEICkgfXsnVmFsdWUnfSAgICA9ICRNb250aEFycmF5WyRJRF07CiAgICAgICAgICAgICRNb250aHsgc3ByaW50ZiggIiUwMmQiLCAkSUQgKSB9eydQb3NpdGlvbid9ID0gJElEOwogICAgICAgICAgICBpZiAoICRQYXJhbXtNb250aH0gPT0gJElEICkgewogICAgICAgICAgICAgICAgJE1vbnRoeyBzcHJpbnRmKCAiJTAyZCIsICRJRCApIH17J1NlbGVjdGVkJ30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRnJvbnRlbmR7J01vbnRoT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvbkVsZW1lbnQoCiAgICAgICAgICAgIERhdGEgPT4gXCVNb250aCwKICAgICAgICAgICAgTmFtZSA9PiAiTW9udGgiLAogICAgICAgICk7CgogICAgICAgIG15ICVZZWFyID0gKCk7CgogICAgICAgICMgRklYTUUgdGhlIHJhbmdlIHNob3VsZCBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkKICAgICAgICAjIEZ1cnRoZXIsIGhlcmUgSSBjYW4gdXNlIHRoZSBtYXAgZnVuY3Rpb24KICAgICAgICBmb3IgKCBteSAkSUQgPSAyMDA1OyAkSUQgPD0gMjAwODsgJElEKysgKSB7CiAgICAgICAgICAgICRZZWFyeyRJRH0gPSAkSUQ7CiAgICAgICAgfQogICAgICAgICRGcm9udGVuZHsnWWVhck9wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICA9PiBcJVllYXIsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgICAgICAgPT4gJFBhcmFte1llYXJ9IHx8ICcnLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICJZZWFyIiwKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CgogICAgICAgICggJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAtMSwgMCApOwogICAgICAgICggJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAxLCAwICk7CgogICAgICAgIG15ICVVc2VyUmVwb3J0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJSZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVVzZXJCYXNpY3MgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgpOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgaWYgKCAkVXNlclJlcG9ydHskVXNlcklEfSApIHsKICAgICAgICAgICAgICAgIGZvciAocXcoTGVhdmVEYXkgT3ZlcnRpbWUgV29ya2luZ0hvdXJzIERpc2Vhc2VkIExlYXZlRGF5UmVtYWluaW5nIE92ZXJ0aW1lVG90YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRffSA9IHNwcmludGYoICIlLjJmIiwgJFVzZXJSZXBvcnR7JFVzZXJJRH17JF99ICk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFteyAnVG90YWwnIC4gJF8gfSArPSAkUGFyYW17JF99OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgU2hvdyBPdmVydGltZSBpZiBhbGxvd2VkCiAgICAgICAgICAgICAgICBpZiAoICEkVXNlckJhc2ljc3skVXNlcklEfXtTaG93T3ZlcnRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZVRvdGFsfSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VyfSAgID0gJFNob3duVXNlcnN7JFVzZXJJRH07CiAgICAgICAgICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRVc2VySUQ7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKAogICAgICAgICAgICBxdyhUb3RhbExlYXZlRGF5IFRvdGFsT3ZlcnRpbWUgVG90YWxXb3JraW5nSG91cnMKICAgICAgICAgICAgVG90YWxEaXNlYXNlZCBUb3RhbExlYXZlRGF5UmVtYWluaW5nIFRvdGFsT3ZlcnRpbWVUb3RhbCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFteyRffSApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSByZXBvcnQgc29ydCBieSBwcm9qZWN0cwogICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnICkgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ2FsbCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAnYWxsJyApIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICd2YWxpZCc7CiAgICAgICAgfQoKICAgICAgICBteSAlUHJvamVjdERhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICk7CgogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgICAgICBzb3J0IHsgJFByb2plY3R7UHJvamVjdH17JGF9IGNtcCAkUHJvamVjdHtQcm9qZWN0fXskYn0gfQogICAgICAgICAgICBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAkUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkUHJvamVjdElEIG5lICctMScgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgID0gJ2NvbnRlbnR2YWx1ZSc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUHJvamVjdHtQcm9qZWN0U3RhdHVzfXskUHJvamVjdElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1N0YXR1c30gPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtTdGF0dXN9ID0gJ3Bhc3Npdic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRUb3RhbCAgICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkVG90YWxUb3RhbCA9IDA7CgogICAgICAgICAgICAgICAgICAgIGlmICggKCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnICYmICEkUGFyYW17U3RhdHVzfSApCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ3ZhbGlkJyApCiAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhY3Rpb24gc29ydCB3cmFwcGVyIC0gYmUgY2FyZWZ1bCBpdHMgbm90IHNpbXVsYXIgd2l0aCBwcm9qZWN0ISEKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVNvcnRlZEFjdGlvbnMgPSAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJXsgJFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvcnRlZEFjdGlvbnN7JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Jvd1NwYW59Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0IHsgJFNvcnRlZEFjdGlvbnN7JGF9IGNtcCAkU29ydGVkQWN0aW9uc3skYn0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlU29ydGVkQWN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZvcmVhY2ggbXkgJEFjdGlvbklEIChrZXlzICV7JFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17SG91cnN9ICA9IHNwcmludGYoICIlLjJmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUHJvamVjdERhdGF7UGVyTW9udGh9eyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9IHx8IDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9IHx8IDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb3RhbCAgICAgICs9ICRQYXJhbXtIb3Vyc307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG90YWxUb3RhbCArPSAkUGFyYW17SG91cnNUb3RhbH07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gICAgICAgICAgICA9ICRQcm9qZWN0e1Byb2plY3R9eyRQcm9qZWN0SUR9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0SUR9ICAgICAgICAgID0gJFByb2plY3RJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdERlc2NyaXB0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFByb2plY3R7UHJvamVjdERlc2NyaXB0aW9ufXskUHJvamVjdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgICAgPSAnY29udGVudGtleSc7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgICA9ICdUb3RhbCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gICAgICA9IHNwcmludGYoICIlLjJmIiwgJFRvdGFsICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFRvdGFsVG90YWwgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgKz0gJFRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSArPSAkVG90YWxUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte1RvdGFsSG91cnN9ICkgewogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSApIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gPSAwOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzfSApOwogICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSApOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJSZXBvcnRpbmciICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGltZSBhY2NvdW50aW5nIHByb2plY3QgcmVwb3J0aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Byb2plY3RSZXBvcnRpbmcnICkgewogICAgICAgIG15ICRPdXRwdXQgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCA9ICgpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1JvfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgKHF3KFByb2plY3RJRCkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgICAgIGZvciAocXcoUHJvamVjdElEKSkgewogICAgICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gIlByb2plY3RSZXBvcnRpbmc6IE5lZWQgJF8iICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgJFBhcmFte1Byb2plY3R9ID0gJFByb2plY3R7UHJvamVjdH17ICRQYXJhbXtQcm9qZWN0SUR9IH07CgogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAwICk7CgogICAgICAgICMgbmVjYXNzYXJ5IGJlY2F1c2UgdGhlIFByb2plY3RBY3Rpb25SZXBvcnRpbmcgaXMgbm90IHJld29ya2VkCiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0KICAgICAgICAgICAgLT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLCApOwogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICgpOwogICAgICAgIG15ICVQcm9qZWN0VGltZSA9ICgpOwoKICAgICAgICAjIE9ubHkgb25lIGZ1bmN0aW9uIHNob3VsZCBiZSBlbm91Z2gKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVNob3duVXNlcnMgKSB7CgogICAgICAgICAgICAjIE92ZXJ2aWV3IHBlciBwcm9qZWN0IGFuZCBhY3Rpb24KICAgICAgICAgICAgJVByb2plY3REYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RBY3Rpb25SZXBvcnRpbmcoCiAgICAgICAgICAgICAgICBZZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFByb2plY3REYXRhe1RvdGFsfXsgJFBhcmFte1Byb2plY3RJRH0gfSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICV7ICRQcm9qZWN0RGF0YXtUb3RhbH17ICRQYXJhbXtQcm9qZWN0SUR9IH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfQogICAgICAgICAgICAgICAgICAgICAgICA9ICRQcm9qZWN0RGF0YXtUb3RhbH17ICRQYXJhbXtQcm9qZWN0SUR9IH17JEFjdGlvbklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSggJFNob3duVXNlcnN7JFVzZXJJRH0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSBoZWFkZXJsaW5lCiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlck5hbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFVzZXIgPT4gJFNob3duVXNlcnN7JFVzZXJJRH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYmV0dGVyIHNvbHV0aW9uIGZvciBzb3J0IGFjdGlvbnMgbmVjZXNzYXJ5CiAgICAgICAgbXkgJU5ld0FjdGlvbiA9ICgpOwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICVQcm9qZWN0VGltZSApIHsKICAgICAgICAgICAgJE5ld0FjdGlvbnskQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgfQogICAgICAgICVBY3Rpb24gPSAlTmV3QWN0aW9uOwoKICAgICAgICAjIHNob3cgdGhlIHJlc3VsdHMKICAgICAgICBteSAlVG90YWwgPSAoKTsKICAgICAgICBmb3IgbXkgJEFjdGlvbklEICggc29ydCB7ICRBY3Rpb257JGF9IGNtcCAkQWN0aW9ueyRifSB9IGtleXMgJUFjdGlvbiApIHsKICAgICAgICAgICAgbXkgJFRvdGFsSG91cnMgPSAwOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBBY3Rpb24gPT4gJEFjdGlvbnskQWN0aW9uSUR9LCB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifSB9IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICAgICAkVG90YWxIb3VycyAgICAgKz0gJFByb2plY3RUaW1leyRBY3Rpb25JRH17JFVzZXJJRH17SG91cnN9OwogICAgICAgICAgICAgICAgJFRvdGFseyRVc2VySUR9ICs9ICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9e0hvdXJzfTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhvdXJzID0+IHNwcmludGYoICIlLjJmIiwgJFByb2plY3RUaW1leyRBY3Rpb25JRH17JFVzZXJJRH17SG91cnN9IHx8IDAgKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBUb3RhbAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgSG91cnMgPT4gc3ByaW50ZiggIiUuMmYiLCAkVG90YWxIb3VycyApLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17VG90YWxBbGx9ID0gMDsKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifSB9IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEFsbH0gKz0gJFRvdGFseyRVc2VySUR9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlclRvdGFsJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBUb3RhbCA9PiBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbHskVXNlcklEfSApLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RvdGFsQWxsfSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsQWxsfSApOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJQcm9qZWN0UmVwb3J0aW5nIiApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nUHJvamVjdFJlcG9ydGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzaG93IGVycm9yIHNjcmVlbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdJbnZhbGlkIFN1YmFjdGlvbiBwcm9jZXNzIScgKTsKfQoKMTsK
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIGVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ0VkaXQuZHRsLHYgMS43IDIwMDcvMDYvMDUgMTQ6MTg6MTIgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCBUaW1lIEFjY291bnRpbmcifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJPdmVydmlldyJ9PC9hPgo8IS0tIGR0bDpibG9jazpDcmVhdGVQcm9qZWN0IC0tPgogICAgICAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RTZXR0aW5nIiBjbGFzcz0ibWVudWl0ZW0iPgogICAgICAkVGV4dHsiUHJvamVjdFNldHRpbmcifQogICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOkNyZWF0ZVByb2plY3QgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJFZGl0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlRpbWUgc2VsZWN0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICREYXRheyJEYXRlIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhckJhY2sifSZNb250aD0kTFFEYXRheyJNb250aEJhY2sifSZEYXk9JExRRGF0YXsiRGF5QmFjayJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWxlZnQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiYmFjayJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhck5leHQifSZNb250aD0kTFFEYXRheyJNb250aE5leHQifSZEYXk9JExRRGF0YXsiRGF5TmV4dCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXJpZ2h0LWJpZy5wbmciIGFsdD0iJFRleHR7Im5leHQifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiSW5jb21wbGV0ZSBEYXlzIn06CjwhLS0gZHRsOmJsb2NrOkluY29tcGxldGVXb3JraW5nRGF5cyAtLT4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mRGF5PSRMUURhdGF7IkRheSJ9Ij4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQm9sZFN0YXJ0In0KICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlllYXIifS0kUURhdGF7Ik1vbnRoIn0tJFFEYXRheyJEYXkifQogICAgICAgICAgICAgICAgICAgICREYXRheyJCb2xkRW5kIn0KICAgICAgICAgICAgICAgICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOkluY29tcGxldGVXb3JraW5nRGF5cyAtLT4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluY29tcGxldGVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRWRpdCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdGF0dXMiICAgIHZhbHVlPSJBY3Rpb24iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iWWVhciIgICAgICB2YWx1ZT0iJERhdGF7IlllYXIifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNb250aCIgICAgIHZhbHVlPSIkRGF0YXsiTW9udGgifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJEYXkiICAgICAgIHZhbHVlPSIkRGF0YXsiRGF5In0iPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGF0ZSJ9OiAkVGV4dHsiJFFEYXRheyJXZWVrZGF5X3RvX1RleHQifSJ9ICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkFjdGlvbiJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXJ0dGltZSJ9PHNwYW4gY2xhc3M9IiRRRGF0YXsiQ2xhc3NUaW1lIn0iPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJFbmR0aW1lIn08c3BhbiBjbGFzcz0iJFFEYXRheyJDbGFzc1RpbWUifSI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlBlcmlvZCJ9PHNwYW4gY2xhc3M9ImZvb3Rub3RlIj4kUURhdGF7IlBlcmlvZE5vdGUifTwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJQcm9qZWN0T3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkFjdGlvbk9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJSZW1hcmtbJFFEYXRheyJJRCJ9XSIgICAgdmFsdWU9IiRRRGF0YXsiUmVtYXJrIn0iICAgIHNpemU9IjM1Ij48L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJTdGFydFRpbWUifSI8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJFbmRUaW1lIn0iPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdGFydFRpbWVbJFFEYXRheyJJRCJ9XSIgdmFsdWU9IiRRRGF0YXsiU3RhcnRUaW1lIn0iIHNpemU9IjciPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRW5kVGltZVskUURhdGF7IklEIn1dIiAgIHZhbHVlPSIkUURhdGF7IkVuZFRpbWUifSIgICBzaXplPSI3Ij48L3RkPgo8IS0tIGR0bDpibG9jazpVbml0SW5wdXRQZXJpb2QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iJFFEYXRheyJUZXh0UG9zaXRpb24ifSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlBlcmlvZFskUURhdGF7IklEIn1dIiAgICB2YWx1ZT0iJFFEYXRheyJQZXJpb2QifSIgICAgc2l6ZT0iNyI+PC90ZD4KPCEtLSBkdGw6YmxvY2s6VW5pdElucHV0UGVyaW9kIC0tPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249IiRRRGF0YXsiVGV4dFBvc2l0aW9uIn0iPiRRRGF0YXsiUGVyaW9kIn08L3RkPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZXF1aXJlZCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlYWRvbmx5IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJyZWFkb25seSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZWFkb25seSAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdEJsb2NrIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPgo8IS0tIGR0bDpibG9jazpPdGhlclRpbWVzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0yIiBuYW1lPSJMZWF2ZURheSIgJERhdGF7IkxlYXZlRGF5In0+JFRleHR7IkxlYXZlIERheSJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTEiIG5hbWU9IkRpc2Vhc2VkIiAkRGF0YXsiRGlzZWFzZWQifT4kVGV4dHsiRGlzZWFzZWQifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0zIiBuYW1lPSJPdmVydGltZSIgJERhdGF7Ik92ZXJ0aW1lIn0+JFRleHR7Ik92ZXJ0aW1lIn0KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6VG90YWwgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249IiRRRGF0YXsiVGV4dFBvc2l0aW9uIn0iPiRRRGF0YXsiVG90YWwifSZuYnNwOzwvdGQ+CjwhLS0gZHRsOmJsb2NrOlRvdGFsIC0tPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlZCI+JFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVhZG9ubHkgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZWFkb25seSI+JFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZWFkb25seSAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iIG5hbWU9IkRlbGV0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlZCI+KiAkVGV4dHsiUmVxdWlyZWQgRmllbGQifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpGb290Tm90ZSAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290bm90ZSI+KiAkVGV4dHsiWW91IGhhdmUgdG8gaW5zZXJ0IFN0YXJ0LSBhbmQgRW5kdGltZSBvciBhIFBlcmlvZCJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZvb3ROb3RlIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rub3RlIj4qICRUZXh0eyJJZiB5b3UgdXNlIGFjdGlvbiBtaXNjLCBwbGVhc2UgZ2l2ZSBhbiBleHBsYW5hdGlvbiBpbiB0aGUgZmllbGQgcmVtYXJrIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdWaWV3LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9yIHZpZXcgaW5zZXJ0cyBvZiBvbmUgZGF5CiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdWaWV3LmR0bCx2IDEuMyAyMDA2LzEyLzA4IDE1OjA3OjIzIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlZpZXcgVGltZSBBY2NvdW50aW5nIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbiJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWaWV3IG9mICJ9ICRRRGF0YXsiVXNlciJ9PGJyPjxicj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWaWV3Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJJRCIgICAgdmFsdWU9IiRRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiVGltZSBzZWxlY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRhdGVTZWxlY3Rpb24ifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkRhdGUifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZZZWFyPSRRRGF0YXsiWWVhckJhY2sifSZNb250aD0kUURhdGF7Ik1vbnRoQmFjayJ9JkRheT0kUURhdGF7IkRheUJhY2sifSZVc2VySUQ9JFFEYXRheyJVc2VySUQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1sZWZ0LWJpZy5wbmciIGFsdD0iJFRleHR7ImJhY2sifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZZZWFyPSRRRGF0YXsiWWVhck5leHQifSZNb250aD0kUURhdGF7Ik1vbnRoTmV4dCJ9JkRheT0kUURhdGF7IkRheU5leHQifSZVc2VySUQ9JFFEYXRheyJVc2VySUQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1yaWdodC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJuZXh0In0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRGF0ZSJ9OiAkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9ICRRRGF0YXsiRGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI5MCUiPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiQWN0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJSZW1hcmsifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXJ0dGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRW5kdGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUGVyaW9kIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiUHJvamVjdCJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkFjdGlvbiJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IlJlbWFyayJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiU3RhcnRUaW1lIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJFbmRUaW1lIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJQZXJpb2QifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdEJsb2NrIC0tPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPgogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRvdGFsIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWwifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VG90YWwgLS0+CjwhLS0gZHRsOmJsb2NrOk90aGVyVGltZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTIiIG5hbWU9IkxlYXZlRGF5IiAkRGF0YXsiTGVhdmVEYXkifSBkaXNhYmxlZD4kVGV4dHsiTGVhdmUgRGF5In0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTEiIG5hbWU9IkRpc2Vhc2VkIiAkRGF0YXsiRGlzZWFzZWQifSBkaXNhYmxlZD4kVGV4dHsiRGlzZWFzZWQifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSItMyIgbmFtZT0iT3ZlcnRpbWUiICREYXRheyJPdmVydGltZSJ9IGRpc2FibGVkPiRUZXh0eyJPdmVydGltZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdGhlclRpbWVzIC0tPgo8IS0tIGR0bDpibG9jazpWYWNhdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlZhY2F0aW9uIn0KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlZhY2F0aW9uIC0tPgogICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+PC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdTZXR0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHNldHRpbmdzCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdTZXR0aW5nLmR0bCx2IDEuNiAyMDA2LzEyLzA4IDE1OjA3OjIzIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8IS0tIGR0bDpibG9jazpQcm9qZWN0U2V0dGluZyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJFZGl0IFRpbWUgQWNjb3VudGluZyBQcm9qZWN0IFByZWZlcmVuY2UifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuIn0iIGNsYXNzPSJtZW51aXRlbSI+CiAgICAgICRUZXh0eyJCYWNrIn0KICAgICAgPC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlByb2plY3RTZXR0aW5nIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiUHJvamVjdCBTZXR0aW5nIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgIDx0ciAgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkRlc2NyaXB0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlByb2plY3RbJFFEYXRheyJQcm9qZWN0SUQifV0iIHZhbHVlPSIkUURhdGF7IlByb2plY3QifSIgc2l6ZT0iMzAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9IjIiIG5hbWU9IlByb2plY3REZXNjcmlwdGlvblskUURhdGF7IlByb2plY3RJRCJ9XSIgY29scz0iNDAiPiRRRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld1Byb2plY3QiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblByb2plY3QiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdFNldHRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlNldHRpbmcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCBUaW1lIEFjY291bnRpbmcgUHJlZmVyZW5jZSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFNldHRpbmciIGNsYXNzPSJtZW51aXRlbSI+CiAgICAgICRUZXh0eyJQcm9qZWN0U2V0dGluZyJ9CiAgICAgIDwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQWN0aW9uIFNldHRpbmcifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBY3Rpb24ifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0dXMifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkFjdGlvblskUURhdGF7IkFjdGlvbklEIn1dIiB2YWx1ZT0iJFFEYXRheyJBY3Rpb24ifSIgc2l6ZT0iNDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbiAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld0FjdGlvbiI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgbmFtZT0iQWN0aW9uQWN0aW9uIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgICA8YnI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlVzZXIgU2V0dGluZyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgY29sc3Bhbj0iMyI+JFFEYXRheyJVc2VyIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVzY3JpcHRpb24ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRlc2NyaXB0aW9uIn0KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz0iMSIgbmFtZT0iRGVzY3JpcHRpb25bJFFEYXRheyJVc2VySUQifV0iIGNvbHM9IjQwIj48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJDaGVja2JveCIgbmFtZT0iU2hvd092ZXJ0aW1lWyRRRGF0YXsiVXNlcklEIn1dIiB2YWx1ZT0iMSIgJERhdGF7IlNob3dPdmVydGltZSJ9PgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJTaG93IE92ZXJ0aW1lIn08YnI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9IkNoZWNrYm94IiBuYW1lPSJDcmVhdGVQcm9qZWN0WyRRRGF0YXsiVXNlcklEIn1dIiB2YWx1ZT0iMSIgJERhdGF7IkNyZWF0ZVByb2plY3QifT4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ3JlYXRlIFByb2plY3QifQogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTdGFydGRhdGUifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkVuZGRhdGUifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkxlYXZlIERheSJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV2Vla2x5IEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7Ik92ZXJ0aW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQZXJpb2QgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRGF0ZVN0YXJ0WyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJEYXRlU3RhcnQifSIgc2l6ZT0iMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkRhdGVFbmRbJFFEYXRheyJVc2VySUQifV1bJFFEYXRheyJQZXJpb2QifV0iIHZhbHVlPSIkUURhdGF7IkRhdGVFbmQifSIgc2l6ZT0iMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkxlYXZlRGF5c1skUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiTGVhdmVEYXlzIn0iIHNpemU9IjUiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldlZWtseUhvdXJzWyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJXZWVrbHlIb3VycyJ9IiBzaXplPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJPdmVydGltZVskUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiT3ZlcnRpbWUifSIgc2l6ZT0iNSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiU3RhdHVzT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGVyaW9kIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcgdXNlciBzZXR0aW5nIn0iICBuYW1lPSJOZXdVc2VyU2V0dGluZ1skUURhdGF7IlVzZXJJRCJ9XSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGhyPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgo8IS0tIGR0bDpibG9jazpOZXdVc2VyT3B0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik5ld1VzZXJPcHRpb24ifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcifSIgIG5hbWU9Ik5ld1VzZXIiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TmV3VXNlck9wdGlvbiAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblVzZXIiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2V0dGluZyAtLT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdPdmVydmlldy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHRpbWUgYWNjb3VudGluZyBvdmVydmlldwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nT3ZlcnZpZXcuZHRsLHYgMS44IDIwMDcvMDYvMDUgMTQ6MTg6MzggdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVGltZSBBY2NvdW50aW5nIE92ZXJ2aWV3IHBlciBNb250aCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjMzJSIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIyIiBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPdmVydmlldyBvZiAifSAkUURhdGF7IlVzZXIifTxicj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjQiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXJCYWNrIn0mTW9udGg9JExRRGF0YXsiTW9udGhCYWNrIn0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgJiMwNjA7JiMwNjA7CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgJm5ic3A7Jm5ic3A7CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JExRRGF0YXsiWWVhck5leHQifSZNb250aD0kTFFEYXRheyJNb250aE5leHQifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAmIzA2MjsmIzA2MjsKICAgICAgICAgICAgPC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgPHRyICREYXRheyJTdHlsZSJ9PgogICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj0kTFFEYXRheyJTdWJhY3Rpb24ifSZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JkRheT0kTFFEYXRheyJEYXkifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAkUURhdGF7IkRheSJ9CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+JFRleHR7IiRRRGF0YXsiV2Vla2RheV90b19UZXh0In0ifTwvdGQ+CiAgICAgICAgICA8dGQ+JFRleHR7IiRRRGF0YXsiQ29tbWVudCJ9In08L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJsZWZ0Ij4kVGV4dHsiV29ya2luZ0hvdXJzIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJyaWdodCI+JFFEYXRheyJXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMzMlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpPdmVydGltZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiT3ZlcnRpbWUifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJ0aGlzIG1vbnRoIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7InVudGlsIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiT3ZlcnRpbWVVbnRpbCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkPiRUZXh0eyJPdmVydGltZSB0b3RhbCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7Ik92ZXJ0aW1lVG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydGltZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiTGVhdmUgRGF5cyJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7IkxlYXZlRGF5IHRoaXMgbW9udGgifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJMZWF2ZURheSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiTGVhdmVEYXlUb3RhbCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5VG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZD4kVGV4dHsiTGVhdmVEYXkgcmVtYWluaW5nIn06PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJEaXNlYXNlZCJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7IkRpc2Vhc2VkIHRoaXMgbW9udGgifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJEaXNlYXNlZCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiRGlzZWFzZWRUb3RhbCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkRpc2Vhc2VkVG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlByb2plY3QgUmVwb3J0aW5nIn06CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mUHJvamVjdFN0YXR1c1Nob3c9JExRRGF0YXsiUHJvamVjdFN0YXR1c1Nob3cifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAoJFRleHR7IlNob3cifSAkVGV4dHsiJFFEYXRheyJQcm9qZWN0U3RhdHVzU2hvdyJ9In0gJFRleHR7IlByb2plY3RzIn0pCiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7InBlciBNb250aCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IiREYXRheyJSb3dTcGFuIn0iIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnRrZXkkUURhdGF7IlN0YXR1cyJ9Ij4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdE5vTGluayAtLT4KICAgICAgICAgICAgICAgICAgJERhdGF7IlByb2plY3QifQo8IS0tIGR0bDpibG9jazpQcm9qZWN0Tm9MaW5rIC0tPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFJlcG9ydGluZyZQcm9qZWN0SUQ9JFFEYXRheyJQcm9qZWN0SUQifSI+CiAgICAgICAgICAgICAgICAgICREYXRheyJQcm9qZWN0In0KICAgICAgICAgICAgICAgICAgPC9hPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50dmFsdWUkUURhdGF7IlN0YXR1cyJ9Ij4kRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiA+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iIGFsaWduPSJyaWdodCI+JFFEYXRheyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcuZHRsLHYgMS43IDIwMDcvMDUvMTEgMTQ6MzY6MzcgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlRpbWUgUHJlcG9ydGluZyJ9OiAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCIgPiRUZXh0eyJUaW1lIHNlbGVjdGlvbiJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iUmVwb3J0aW5nIj4KICAgICAgICAgICAgICAkRGF0YXsiTW9udGhPcHRpb24ifQogICAgICAgICAgICAgICREYXRheyJZZWFyT3B0aW9uIn0KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JExRRGF0YXsiWWVhckJhY2sifSZNb250aD0kTFFEYXRheyJNb250aEJhY2sifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1sZWZ0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik9uZSBkYXkgYmFjayJ9Ij48L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1SZXBvcnRpbmcmWWVhcj0kTFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoTmV4dCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXJpZ2h0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik5leHQgZGF5In0iPjwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlVzZXIgUmVwb3J0aW5nIn06PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPiRUZXh0eyJwZXIgTW9udGgifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV29ya2luZyBIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkxlYXZlIERheXMifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkRpc2Vhc2VkIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJPdmVydGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTGVhdmVEYXkgUmVtYWluaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlVzZXJJRD0kTFFEYXRheyJVc2VySUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiVXNlciJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IldvcmtpbmdIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiZuYnNwOyRRRGF0YXsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJEaXNlYXNlZCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiZuYnNwOyRRRGF0YXsiT3ZlcnRpbWVUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsTGVhdmVEYXkifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsRGlzZWFzZWQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsT3ZlcnRpbWVUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxMZWF2ZURheVJlbWFpbmluZyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBjbGFzcz0iY29udGVudGJvZHkiIGJvcmRlcj0iMCIgd2lkdGg9IjUwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgJFRleHR7IlByb2plY3QgUmVwb3J0aW5nIn06CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVJlcG9ydGluZyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlByb2plY3RTdGF0dXNTaG93PSRMUURhdGF7IlByb2plY3RTdGF0dXNTaG93In0iPgogICAgICAgICAgICAoJFRleHR7IlNob3cifSAkVGV4dHsiJFFEYXRheyJQcm9qZWN0U3RhdHVzU2hvdyJ9In0gJFRleHR7IlByb2plY3RzIn0pCiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7InBlciBNb250aCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IiREYXRheyJSb3dTcGFuIn0iIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnRrZXkkUURhdGF7IlN0YXR1cyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFJlcG9ydGluZyZQcm9qZWN0SUQ9JFFEYXRheyJQcm9qZWN0SUQifSI+CiAgICAgICAgICAgICAgICAgICREYXRheyJQcm9qZWN0In0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnR2YWx1ZSRRRGF0YXsiU3RhdHVzIn0iPiREYXRheyJQcm9qZWN0RGVzY3JpcHRpb24ifTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iID4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiSG91cnNUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyICBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdQcm9qZWN0UmVwb3J0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nUHJvamVjdFJlcG9ydGluZy5kdGwsdiAxLjIgMjAwNi8xMi8wOCAxNTowNzoyMyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVGltZSBQcm9qZWN0IFByZXBvcnRpbmcifTogJFFEYXRheyJQcm9qZWN0In0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW4ifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiMgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIiA+JFRleHR7IlRpbWUgc2VsZWN0aW9uIn08L3RkPgojICAgICAgICA8L3RyPgojICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgICAgICAgICAgPHRkPgojICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KIyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgojICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJSZXBvcnRpbmciPgojICAgICAgICAgICAgICAkRGF0YXsiTW9udGhPcHRpb24ifQojICAgICAgICAgICAgICAkRGF0YXsiWWVhck9wdGlvbiJ9CiMgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiMgICAgICAgICAgICA8L2Zvcm0+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICA8dGFibGU+CiMgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQojICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JFFEYXRheyJZZWFyQmFjayJ9Jk1vbnRoPSRRRGF0YXsiTW9udGhCYWNrIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9bGVmdC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJPbmUgZGF5IGJhY2sifSI+PC9hPgojICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRRRGF0YXsiTW9udGhOZXh0In0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9cmlnaHQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiTmV4dCBkYXkifSI+PC9hPgojICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgIDwvdHI+CiMgICAgICAgICAgICA8L3RhYmxlPgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiMgICAgICAgIDwvdHI+CiMgICAgICA8L3RhYmxlPgojICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICRUZXh0eyJQcm9qZWN0IFJlcG9ydGluZyJ9OiAkUURhdGF7IlByb2plY3QifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkFjdGlvbiJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlck5hbWUgLS0+CiAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJVc2VyIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyTmFtZSAtLT4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiSG91cnMifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRvdGFsIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyVG90YWwgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlclRvdGFsIC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxBbGwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdEZWxldGUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBkZWxldGUgYSBkYXkgb2YgdGltZWFjY291bnRpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBPVFJTIEdtYkgsIGh0dHA6Ly93d3cub3Rycy5kZS8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ0RlbGV0ZS5kdGwsdiAxLjEuMS4xIDIwMDUvMDkvMDUgMTI6MTg6NDMgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjwhLS0gc3RhcnQgZm9ybSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJEZWxldGUifTogJFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KIyAgPHRyPgojICAgIDx0ZCBjbGFzcz0ibWVudSI+CiMgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgojICAgIDwvdGQ+CiMgIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjM1MCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgID4kVGV4dHsiRGVsZXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0In0/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUURhdGF7IlllYXIifSZNb250aD0kUURhdGF7Ik1vbnRoIn0mRGF5PSRRRGF0YXsiRGF5In0iIj4kVGV4dHsiTm8ifTwvYT4gPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJlllYXI9JFFEYXRheyJZZWFyIn0mTW9udGg9JFFEYXRheyJNb250aCJ9JkRheT0kUURhdGF7IkRheSJ9Ij4kVGV4dHsiWWVzIn08L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ob3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTm90aWZpY2F0aW9uVGltZUFjY291bnRpbmcucG0sdiAxLjUgMjAwOC8wNy8yOCAxMDowNDo1MSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpOb3RpZmljYXRpb25UaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nLT5uZXcoJVBhcmFtKTsKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKCBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwgKTsKICAgIG15ICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgKTsKICAgIGlmICggJFVzZXJ7ICRTZWxmLT57VXNlcklEfSB9ICkgewogICAgICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwoKICAgICAgICAjIHJlZGlyZWN0IGlmIGluY29tcGxldGUgd29ya2luZyBkYXkgYXJlIG91dCBvZiByYW5nZQogICAgICAgIGlmICggJEluY29tcGxldGVXb3JraW5nRGF5c3tXYXJuaW5nfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJ1BsZWFzZSBpbnNlcnQgeW91ciB3b3JraW5nIGhvdXJzIScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICcnOwp9CgoxOwo=
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAEo0lEQVQ4y42VW2yURRTHf99lu7tdSr/laoBCa28qERaRRChSUWKEYKhcEqMEKoIKIdbGEDHRaIhCMJK2MZHEB60aHlRCMEDkQSlGFC1Bti1eCoFuuZV7lwK97DdzxoduSxERTnIyk8nM7/wzc+YcyxjDnSxv0U7PaIkZpRGt4yd3LUze6Yx1O3Dh0u9jRusKUbrMKO2J0oivMEojSifFV9vFVzXn9y+L3xW4+MU6z4hUidblxsskK38Y9xVEKRwVIdO1ONDSwemjFzlZ34Lfch6jVK0oqbzcuCp5W3Dx8jrPiKkj6MTGlOTycslIysaFEAPraw+TEw0wd04xKQMHL/p8/kMr+z/dh7rYERelZ145UtkPt/uhK/Z6xpg6OysYm7ckxmfzx/JUToiUgG9g3NAMRkSDCCAGxkcDvLeggBUflOGOyI6Jr+sGjd3o3QI2IlV20I3NWjSeiknZBB2LlECPQErg6dlFTJmaiza94FOtCcTA3GKP8vXzcLMzY6J01U3gomV7YkZL+Zjpebw0IRtlelWmBFLp0Tc3/HBjnPklk9iw5lVSGqbneUxd9TjG1+WhIe/G+sFGpCI8PMKCKSMI2L1KB3pPH1zgcEOcJbNnIiLEZjxB8loX3RrufziXwcX3IEpX3ABrKRtaMIwJQzPw04CBavu8aQD0rc1fMGTiozRetdjdepXWjh5Glz6A+LoMwM1/breHMV5hwRC0segWCNhgG7Ct3vtqbopzujXB2ytfQIuwurqWzvxHaE8F6dGKoANiLEZNzKFBa8+yX/dsIxITpYlGw9R+9Se7vjvCNQVdGro1JBIJ1jz/DIn6H7l6JcmMxSu50K05+3cDgwI2gwI2l5rP0/ztIYaN9hClwRBzjdIYLbi2RfJckizCXEmlVVtw9HgCz/MoLS2lurqa3Zs39uf9up9PEMkehnO9E3O5g7BrQfpfuEYkLkrTmezkyaXTCNqQTIMdC+6dUkpR6WzWrtvAKxs+YvDQkWgDSgwR18Z1bWKlBRSW5NN2or0vZtwyxpAz55v20oUTvIem5ZHpWoRdi7BjEXYhaFu4NvjdXThuAByXlBh6tKFLGTqV4boyXPeFX7f9zo53tiWN2RS1AUTp7Ud+ayVoG8IORFzICsCggEVWhsXggM3wwRGimRlkBWyyAjYR175JRMixOLzzEMD2/nQTX9Wc+OssZ46eJ+iQVmsRcW0irkXE7Q0WSQeNuBaRgEXYtQk5FkHH4sTBBC0HWgBq+sFtdYvjxle1Wz/eh+7yCaYVhB0I25DppKFO7zzkQCi9J+hY+Ne72fLmVoBaYzbFb6oVoqXyUltH/MM3dpDqTJFhWwQsCKbBe/afpqmpjZDduxZIe8/Vbt5/9hMunmqPA5W3FKEL9cuTovTMRPO5+GtLttB48CSuBQELMmxobjxN27EL/dniAA2/HGP1rCoSf5yJAzON2ZS8baHPLqryjNJV4uvyyZNHs2jBgzxWMo6CXA9toPn4Zer2HuPrLw9Q/9MxgFqgciD0f1tTZNT6mPi6QnxVJkp7RinE1xgRgGT69Wv67vSue95Ac0Nrvb6vjyH+b3X/Zf8AFuFkUCNJ29gAAAAASUVORK5CYII=