Support
1.0.2
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Fixed sender key in email or Body.txt.
Stable release.
Added download support.
Improved sending format of content.
Fix bug in dtl template.
Fix bugs in mssql and posgresql driver.
Code review and fix oracle and psql bugs.
Complete Win32 compat.
Fixed bug in Hardware.pm.
Fixed Bug in Support.xml.
Support Modul review.
Add new database checks.
Added more database checks.
Improved notifications.
Added init apache checks.
Added init mysql and oracle checks.
Add new admin checks and quote xml input.
Fixed xml and formatting bug.
Init release.
Is verifying System Settings and gives some perfocemance tips.
Prüft fehlerhafte System Einstellungen und gibt Performance Tips.
2.3.x
2.2.x
2.1.x
The Support application will be found at the admin navigation bar in the fourth column and can be used for system checks to find setup errors.
Die Support Applikation ist in der Admin-Navigationsleiste, in der vierten Spalte zu finden. Mit ihr koennen System-Checks ausgeführt werden um Fehler im Setup zu finden.
2008-07-22 10:37:26
opms.otrs.com
IyAtLQojIEFkbWluU3VwcG9ydC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU3VwcG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TdXBwb3J0LmR0bCx2IDEuMTEgMjAwOC8wNy8yMiAwODozNjo0MCBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU3VwcG9ydCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSIzMCUiIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDb25maWRlbnRpYWwiLz4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDb21tZXJjaWFsIFN1cHBvcnQifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgJFRleHR7IkZvciBmYXN0IGhlbHAgc3VibWl0IHlvdXIgc3lzdGVtIGluZm8gYW5kIGNyZWF0ZSBhIGNvbW1lcmNpYWwgc3VwcG9ydCB0aWNrZXQgYXQgdmVuZG9ycyBzaXRlLiJ9CiAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAkVGV4dHsiRm9yIG1vcmUgaW5mbyBzZWU6In0gPGEgaHJlZj0iaHR0cDovL290cnMuY29tLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9vdHJzLmNvbS88L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iLz4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8YnIvPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQmVuY2htYXJrU1FMIi8+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU1FMIEJlbm1hcmsifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgJFRleHR7IkV4ZWN1dGUgYW5kIFNRTCBCZW5jaG1hcmsgb24geW91IGRhdGFiYXNlIHRvIGZpbmQgb3VyIGhvdyBmYXN0IHlvdXIgZGF0YWJhc2UgaXMgKGRvbmUgb24gZGVkaWNhdGVkIGJlbmNobWFyayB0YWJsZSkuIn0KICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICRUZXh0eyJOb3RlOiBUaGlzIHNob3VsZCBub3QgYmUgZG9uZSBvbiBwcm9kdWN0aXZlIHN5c3RlbXMhIn0KICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgIE11bHRpcGxpZXI6ICREYXRheyJNb2RlU3RyZyJ9CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iLz4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8YnIvPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWFpbmJvZHkiPgoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGUgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kUURhdGF7Ik1vZHVsZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIzMCUiPiRUZXh0eyJDaGVjayJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjU1JSI+JFRleHR7IkNvbW1lbnQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVJvdyAtLT4KICAgICAgICAgICAgICA8dHIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFFEYXRheyJEZXNjcmlwdGlvbiJ9Ij4kUURhdGF7Ik5hbWUifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJDb21tZW50In08L3RkPgogICAgICAgICAgICAgICAgPHRkPjxmb250IGNvbG9yPSIkUURhdGF7IkZvbnRDb2xvciJ9Ij4kUURhdGF7IkNoZWNrIn08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZSAtLT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4kRW52eyJCb3gwIn0kVGV4dHsiQWRtaW4gU3VwcG9ydCBJbmZvIn0kRW52eyJCb3gxIn08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdWJtaXQiPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDBweCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgoKPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsSGlkZGVuIC0tPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iJFFEYXRheyJWYWx1ZSJ9Ij4KPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsSGlkZGVuIC0tPgoKICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjgwMHB4IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJDb25maWRlbnRpYWwifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5IiBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkNvbmZpZGVudGlhbCIgcm93cz0iNCIgY29scz0iNzgiPgpBbnkgYW5kIGFsbCBpbmZvcm1hdGlvbiBkaXNjbG9zZWQgdG8gT1RSUyB3aWxsIGJlIGtlcHQgc3RyaWN0bHkgY29uZmlkZW50aWFsIGFuZCBhcmUgb25seSB1c2VkIGZvciBwcm92aWRpbmcgYmV0dGVyIHN1cHBvcnQgc2VydmljZXMgdG8gb3VyIGN1c3RvbWVycy4KICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDb21tZXJjaWFsIHN1cHBvcnQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJFbWFpbCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iU2VuZGVyIiB2YWx1ZT0iJEVudnsiVXNlckVtYWlsIn0iIHNpemU9IjQwIj48Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+KiAkVGV4dHsiUmVxdWlyZWQifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJDb21tZXJjaWFsIHN1cHBvcnQgSUQifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJTdXBwb3J0SUQiIHZhbHVlPSIiIHNpemU9IjQwIj48L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4gKCogJFRleHR7ImlmIHlvdSBhcmUgYWxyZWFkeSBhIGNvbW1lcmNpYWwgc3VwcG9ydCBjdXN0b21lciwgcGxlYXNlIGFkZCB5b3VyIHN1cHBvcnQgaWQuIChub3QgcmVxdWlyZWQhKSJ9KTwvZm9udD48L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNvbXBhbnkifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IkNvbXBhbnkiIHZhbHVlPSIiIHNpemU9IjQwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiU3RyZWV0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJTdHJlZXQiIHZhbHVlPSIiIHNpemU9IjQwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiUG9zdGNvZGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IlBvc3Rjb2RlIiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IkNpdHkiIHZhbHVlPSIiIHNpemU9IjQwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiUGhvbmUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IlBob25lIiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBsZWFzZSBzZW5kIG1lIGluZm9ybWF0aW9uIGFib3V0ICgob3RycykpIHN1cHBvcnQgcGFja2FnZXMuIn06IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iU2VuZEluZm8iIHZhbHVlPSIiIHNpemU9IjEwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJEb3dubG9hZCIgdmFsdWU9IiRUZXh0eyJEb3dubG9hZCJ9Ij4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTZW5kIiB2YWx1ZT0iJFRleHR7IlNlbmQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWwgLS0+CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JEVudnsiQm94MCJ9JFRleHR7IkJlbmNobWFyayJ9JEVudnsiQm94MSJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiUmVzdWx0In06ICRUZXh0eyIkUURhdGF7IkhlYWQifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiS2V5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsdWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI0MCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpCZW5jaG1hcmtSZXN1bHRSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IktleSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJWYWx1ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNvbW1lbnQifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdCAtLT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN1cHBvcnQucG0sdiAxLjE2IDIwMDgvMDcvMjIgMDg6MzY6NDAgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbWFpbDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwp1c2UgRGlnZXN0OjpNRDUgcXcobWQ1X2hleCk7Cgp1c2UgTUlNRTo6QmFzZTY0Owp1c2UgQXJjaGl2ZTo6VGFyOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE2ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydCAtIGdsb2JhbCBzeXN0ZW0gaW5mb3JtYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN1cHBvcnQgaW5mb3JtYXRpb24gdG8gYSBydW5uaW5nIE9UUlMgc3lzdGVtLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgU3VwcG9ydCBvYmplY3QKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7Cm15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7Cm15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKKTsKCiRTdXBwb3J0T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQtPm5ldygKICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCik7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgJFNlbGYtPntYTUxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkU2VsZi0+e01haW5PYmplY3R9LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkU2VsZi0+e0xvZ09iamVjdH0sCgogICAgKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntFbWFpbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW1haWwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkU2VsZi0+e01haW5PYmplY3R9LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkU2VsZi0+e0xvZ09iamVjdH0sCiAgICAgICAgREJPYmplY3QgICAgID0+ICRTZWxmLT57REJPYmplY3R9LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCmdldCBhIGhhc2ggcmVmZXJlbmNlIHdpdGggcG9zc2liaWxpdHkgY2hlY2tzLgoKICAgIG15ICRMaXN0ID0gJFN1cHBvcnQtPkFkbWluQ2hlY2tzR2V0KCk7Cgo9Y3V0CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdygpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvJzsKCiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoICREaXJOYW1lIC4gJy8qLnBtJyApOwoKICAgIG15ICREYXRhSGFzaDsKICAgIE1PRFVMRToKICAgIGZvciBteSAkRmlsZSAoQExpc3QpIHsKCiAgICAgICAgIyByZW1vdmUgLnBtCiAgICAgICAgJEZpbGUgPX4gcy9eLipcLyguKz8pXC5wbSQvJDEvOwogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjokRmlsZSI7CgogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CgogICAgICAgICAgICAjIFRPRE8gTG9nCiAgICAgICAgICAgIG5leHQgTU9EVUxFOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgIyByZXR1cm4gaWYgaW5zdGFuY2UgY2FuIG5vdCBjcmVhdGUKICAgICAgICBpZiAoICEkU3VwcG9ydE9iamVjdCApIHsKCiAgICAgICAgICAgICMgVE9ETyBMb2cKICAgICAgICAgICAgbmV4dCBNT0RVTEU7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhZG1pbiBjaGVjayBkYXRhCiAgICAgICAgbXkgJEFkbWluQ2hlY2tSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKCiAgICAgICAgIyBjaGVjayBpZiByZXR1cm4gdmFsdWUgaXMgYSB2YWxpZCBhcnJheSByZWZlcmVuY2UKICAgICAgICBpZiAoICEkQWRtaW5DaGVja1JlZiB8fCByZWYgJEFkbWluQ2hlY2tSZWYgbmUgJ0FSUkFZJyB8fCAhQHskQWRtaW5DaGVja1JlZn0gKSB7CgogICAgICAgICAgICAjIFRPRE8gTG9nCiAgICAgICAgICAgIG5leHQgTU9EVUxFOwogICAgICAgIH0KCiAgICAgICAgIyBleHRyYWN0IGFsbCB2YWxpZCBlbGVtZW50cwogICAgICAgIG15IEBDbGVhbmRBZG1pbkNoZWNrUmVmID0gZ3JlcCB7IHJlZigkXykgZXEgJ0hBU0gnIH0gQHskQWRtaW5DaGVja1JlZn07CgogICAgICAgICMgYXR0YWNoIHRoZSBjbGVhbmVkIGVsZW1lbnQgYXJyYXkKICAgICAgICAkRGF0YUhhc2gtPnskRmlsZX0gPSBcQENsZWFuZEFkbWluQ2hlY2tSZWY7CiAgICB9CgogICAgcmV0dXJuICREYXRhSGFzaDsKfQoKc3ViIFhNTFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KERhdGFIYXNoKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggcmVmKCAkUGFyYW17RGF0YUhhc2h9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRGF0YUhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFhNTEhhc2ggPSBbXTsKICAgIG15ICRDb3VudE1vZHVsZSA9IDA7CiAgICBteSAkQ291bnRJdGVtICAgPSAwOwogICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICV7ICRQYXJhbXtEYXRhSGFzaH0gfSApIHsKICAgICAgICAkQ291bnRNb2R1bGUrKzsKICAgICAgICAkWE1MSGFzaC0+WzFdLT57U3VwcG9ydEluZm99LT5bMV0tPntNb2R1bGV9LT5bJENvdW50TW9kdWxlXS0+e05hbWV9ID0gJE1vZHVsZTsKICAgICAgICBmb3IgbXkgJERhdGFIYXNoUm93ICggQHsgJFBhcmFte0RhdGFIYXNofS0+eyRNb2R1bGV9IH0gKSB7CiAgICAgICAgICAgICRDb3VudEl0ZW0rKzsKICAgICAgICAgICAgbXkgJERhdGEgPSB7fTsKICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICgga2V5cyAleyREYXRhSGFzaFJvd30gKSB7CiAgICAgICAgICAgICAgICBuZXh0IGlmICRFbGVtZW50IGVxICdOYW1lJzsKICAgICAgICAgICAgICAgICREYXRhLT57JEVsZW1lbnR9LT5bMV0tPntDb250ZW50fSA9ICREYXRhSGFzaFJvdy0+eyRFbGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkWE1MSGFzaC0+WzFdLT57U3VwcG9ydEluZm99LT5bMV0tPntNb2R1bGV9LT5bJENvdW50TW9kdWxlXS0+e0l0ZW19LT5bJENvdW50SXRlbV0gPSAkRGF0YTsKICAgICAgICAgICAgJFhNTEhhc2gtPlsxXS0+e1N1cHBvcnRJbmZvfS0+WzFdLT57TW9kdWxlfS0+WyRDb3VudE1vZHVsZV0tPntJdGVtfS0+WyRDb3VudEl0ZW1dLT57TmFtZX0gPSAkRGF0YUhhc2hSb3ctPntOYW1lfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFhNTFN0cmluZyA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaDJYTUwoIEB7JFhNTEhhc2h9ICk7CgogICAgcmV0dXJuIFwkWE1MU3RyaW5nOwp9CgpzdWIgTG9nTGFzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dTdHJpbmcgPSAkU2VsZi0+e0xvZ09iamVjdH0tPkdldExvZyggTGltaXQgPT4gMTAwMCApOwoKICAgIHJldHVybiAoIFwkTG9nU3RyaW5nLCAkUGFyYW17VHlwZX0uJy5sb2cnICk7Cn0KCnN1YiBNb2R1bGVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIb21lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgIG15ICRUbXBTdW1TdHJpbmc7CiAgICBteSAkVG1wTG9nOwogICAgb3BlbiggJFRtcFN1bVN0cmluZywgInBlcmwgJEhvbWUvYmluL290cnMuY2hlY2tNb2R1bGVzIHwiICk7CgogICAgd2hpbGUgKDwkVG1wU3VtU3RyaW5nPikgewogICAgICAgICRUbXBMb2cgLj0gJF87CiAgICB9CiAgICBjbG9zZSgkVG1wU3VtU3RyaW5nKTsKCiAgICByZXR1cm4gKCBcJFRtcExvZywgJ01vZHVsZUNoZWNrLmxvZycgKTsKfQoKc3ViIEFSQ0hJVkUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkSG9tZSAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBteSAkQXJjaGl2ZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0FSQ0hJVkUnOwoKICAgIG15ICRUYXI7CiAgICBpZiAoICFvcGVuKCAkVGFyLCAnPCcsICRBcmNoaXZlICkgKSB7CiAgICAgICAgbXkgJEFSQ0hJVkVFbXB0eSA9ICJDYW4ndCBvcGVuICRBcmNoaXZlOiAkISI7CiAgICAgICAgcmV0dXJuICggXCRBUkNISVZFRW1wdHksICdBUkNISVZFLmxvZycgKTsKICAgIH0KICAgIGJpbm1vZGUoJFRhcik7CiAgICBteSAlQ29tcGFyZTsKICAgIHdoaWxlICg8JFRhcj4pIHsKICAgICAgICBteSBAUm93ID0gc3BsaXQoIC86Oi8sICRfICk7CiAgICAgICAgY2hvbXAoICRSb3dbMV0gKTsKICAgICAgICAkQ29tcGFyZXsgJFJvd1sxXSB9ID0gJFJvd1swXTsKICAgIH0KICAgIGNsb3NlKCRUYXIpOwoKICAgIG15ICVSZXN1bHQgPSAkU2VsZi0+X0FSQ0hJVkVMb29rdXAoCiAgICAgICAgSW4gICAgICA9PiAkSG9tZSwKICAgICAgICBDb21wYXJlID0+IFwlQ29tcGFyZSwKICAgICAgICBIb21lICAgID0+ICRIb21lLAogICAgKTsKCiAgICBteSAkQVJDSElWRVN0cmluZyA9ICcnOwogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVJlc3VsdCApIHsKICAgICAgICAkQVJDSElWRVN0cmluZyAuPSAiJEtleTokUmVzdWx0eyRLZXl9XG4iOwogICAgfQoKICAgIHJldHVybiAoIFwkQVJDSElWRVN0cmluZywgJ0FSQ0hJVkUubG9nJyApOwp9CgpzdWIgX0FSQ0hJVkVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATGlzdCA9IGdsb2IoIiRQYXJhbXtJbn0vKiIpOwoKICAgIGZvciBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICAkRmlsZSA9fiBzL1wvXC8vXC8vZzsKICAgICAgICBpZiAoIC1kICRGaWxlICYmICRGaWxlICF+IC9DVlMvICYmICRGaWxlICF+IC9eZG9jXC8vICYmICRGaWxlICF+IC9edmFyXC90bXAvICkgewogICAgICAgICAgICAkU2VsZi0+X0FSQ0hJVkVMb29rdXAoCiAgICAgICAgICAgICAgICBJbiAgICAgID0+ICRGaWxlLAogICAgICAgICAgICAgICAgQ29tcGFyZSA9PiAkUGFyYW17Q29tcGFyZX0sCiAgICAgICAgICAgICAgICBIb21lICAgID0+ICRQYXJhbXtIb21lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpbGUgPX4gcy9cUSRQYXJhbXtIb21lfVxFLy87CiMgICAgICAgICAgICBwcmludCBTVERFUlIgIkRpcmVjdG9yeTogJEZpbGVcbiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkT3JpZ0ZpbGUgPSAkRmlsZTsKICAgICAgICAgICAgJEZpbGUgPX4gcy9cUSRQYXJhbXtIb21lfVxFLy87CiAgICAgICAgICAgICRGaWxlID1+IHMvXlwvKC4qKSQvJDEvOwojICAgICAgICAgICAgcHJpbnQgU1RERVJSICJGaWxlOiAkRmlsZVxuIjsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEZpbGUgIX4gL0VudHJpZXN8UmVwb3NpdG9yeXxSb290fENWU3xBUkNISVZFLwogICAgICAgICAgICAgICAgJiYgJEZpbGUgIX4gL15kb2NcLy8KICAgICAgICAgICAgICAgICYmICRGaWxlICF+IC9edmFyXC90bXAvCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgICAgICAgICBvcGVuKCBJTiwgJzwnLCAkT3JpZ0ZpbGUgKSB8fCBkaWUgIkVSUk9SOiAkT3JpZ0ZpbGU6ICQhIjsKICAgICAgICAgICAgICAgIHdoaWxlICg8SU4+KSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbG9zZShJTik7CiAgICAgICAgICAgICAgICBteSAkRGlnZXN0ID0gbWQ1X2hleCgkQ29udGVudCk7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17Q29tcGFyZX0tPnskRmlsZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9ID0gIk5ldyAkRmlsZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSBuZSAkRGlnZXN0ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSA9ICJEaWYgJEZpbGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCBkZWZpbmVkICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICV7ICRQYXJhbXtDb21wYXJlfSB9Owp9CgpzdWIgQXJjaGl2ZUFwcGxpY2F0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEhvbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgbXkgJEFyY2hpdmUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvdG1wL2FwcGxpY2F0aW9uLnRhcic7CiAgICBpZiAoIC1mICRBcmNoaXZlICkgewogICAgICAgIHVubGluayAkQXJjaGl2ZSB8fCBkaWUgIkNhbid0IHVubGluayAkQXJjaGl2ZTogJCEiOwogICAgfQoKICAgIG15IEBMaXN0ID0gJFNlbGYtPkRpcmVjdG9yeUZpbGVzKCBEaXJlY3RvcnkgPT4gJEhvbWUgKTsKI3ByaW50IFNUREVSUiAiTElTVFxuIjsKICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgbXkgJFRhck9iamVjdCA9IEFyY2hpdmU6OlRhci0+bmV3KCk7CiAgICAkVGFyT2JqZWN0LT5hZGRfZmlsZXMoQExpc3QpOwogICAgJFRhck9iamVjdC0+d3JpdGUoICRBcmNoaXZlLCAwICkgfHwgZGllICJDb3VsZCBub3Qgd3JpdGU6ICRfISI7CgojcHJpbnQgU1RERVJSICJBUkNISVZFXG4iOwogICAgIyBhZGQgZmlsZXMgdG8gdGhlIHRhciBhcmNoaXZlCiAgICBvcGVuKCBteSAkVGFyLCAnPCcsICRBcmNoaXZlICk7CiAgICBiaW5tb2RlKCRUYXIpOwogICAgbXkgJFRtcFRhciA9ICcnOwogICAgd2hpbGUgKDwkVGFyPikgewogICAgICAgICRUbXBUYXIgLj0gJF87CiAgICB9CiAgICBjbG9zZSgkVGFyKTsKICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgiQ29tcHJlc3M6OlpsaWIiKSApIHsKICAgICAgICBteSAkR3pUYXIgPSBDb21wcmVzczo6WmxpYjo6bWVtR3ppcCgkVG1wVGFyKTsKI3ByaW50IFNUREVSUiAiQ29tcHJlc3NcbiI7CiAgICAgICAgcmV0dXJuICggXCRHelRhciwgJ2FwcGxpY2F0aW9uLnRhci5neicpOwogICAgfQojcHJpbnQgU1RERVJSICJDb21wcmVzc1xuIjsKCiAgICByZXR1cm4gKCBcJFRtcFRhciwgJ2FwcGxpY2F0aW9uLnRhcicgKTsKfQoKc3ViIERpcmVjdG9yeUZpbGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoRGlyZWN0b3J5KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSBARmlsZXMgPSAoKTsKICAgIG15IEBMaXN0ID0gZ2xvYigiJFBhcmFte0RpcmVjdG9yeX0vKiIpOwoKICAgIGZvciBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICBpZiAoLWQgJEZpbGUgKSB7CiAgICAgICAgICAgIGlmICggJEZpbGUgPX4gL1wvQ1ZTLyApIHsKICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBARmlsZXMsICRTZWxmLT5EaXJlY3RvcnlGaWxlcyggRGlyZWN0b3J5ID0+ICRGaWxlICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICRGaWxlID1+IC9eXC4vICkgewogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRGaWxlID1+IC8jLyApIHsKICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkRmlsZSA9fiAvXC8odmFyXC9hcnRpY2xlfHZhclwvdG1wKS8gKSB7CiAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggLXMgJEZpbGUgPiAoMTAyNCoxMDI0KjAuNSkgKSB7CiNwcmludCBTVERFUlIgIk5POiAkRmlsZVxuIjsKICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBARmlsZXMsICRGaWxlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQEZpbGVzOwp9CgpzdWIgU2VuZEluZm8gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNyZWF0ZSBsb2cgcGFja2FnZQogICAgbXkgKCRMb2dQcmVDb250ZW50LCAkTG9nUHJlRmlsZW5hbWUgKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcHJlJyApOwoKICAgICMgY3JlYXRlIGNoZWNrIHBhY2thZ2UKICAgIG15ICREYXRhSGFzaCA9ICRTZWxmLT5BZG1pbkNoZWNrc0dldCgpOwogICAgbXkgJFhNTENoZWNrID0gJFNlbGYtPlhNTFN0cmluZ0NyZWF0ZSggRGF0YUhhc2ggPT4gJERhdGFIYXNoLCApOwoKICAgICMgY3JlYXRlIGFwcGxpY2F0aW9uIHBhY2thZ2UKICAgIG15ICgkQ29udGVudCwgJEZpbGVuYW1lICkgPSAkU2VsZi0+QXJjaGl2ZUFwcGxpY2F0aW9uKCk7CgogICAgIyBjcmVhdGUgQVJDSElWRSBwYWNrYWdlCiAgICBteSAoJEFSQ0hJVkVDb250ZW50LCAkQVJDSElWRUZpbGVuYW1lICkgPSAkU2VsZi0+QVJDSElWRSgpOwoKICAgICMgY3JlYXRlIG1vZHVsZSBjaGVjayBwYWNrYWdlCiAgICBteSAoJE1vZHVsZUNoZWNrQ29udGVudCwgJE1vZHVsZUNoZWNrRmlsZW5hbWUgKSA9ICRTZWxmLT5Nb2R1bGVDaGVjaygpOwoKICAgICMgY3JlYXRlIGxvZyBwYWNrYWdlCiAgICBteSAoJExvZ1Bvc3RDb250ZW50LCAkTG9nUG9zdEZpbGVuYW1lICkgPSAkU2VsZi0+TG9nTGFzdCggVHlwZSA9PiAnbG9nX3Bvc3QnICk7CgogICAgIyBjcmVhdGUgbWFpbCBib2R5CiAgICBteSAkQm9keSA9ICcnOwogICAgZm9yIG15ICRLZXkgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkQm9keSAuPSAiJEtleTokUGFyYW17JEtleX1cbiI7CiAgICB9CiAgICAkQm9keSAuPSAiRlFETjoiIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZRRE4nKSAuICJcbiI7CiAgICAkQm9keSAuPSAiUHJvZHVjdDoiIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Byb2R1Y3QnKSAuICcgJwogICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1ZlcnNpb24nKSAuICJcbiI7CgogICAgbXkgJFNlbmQgPSAkU2VsZi0+e0VtYWlsT2JqZWN0fS0+U2VuZCgKICAgICAgICBGcm9tICAgICAgID0+ICRQYXJhbXtTZW5kZXJ9IHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZG1pbkVtYWlsJyksCiAgICAgICAgVG8gICAgICAgICA9PiAnc3VwcG9ydEBvdHJzLmNvbScsCiAgICAgICAgU3ViamVjdCAgICA9PiAnU3VwcG9ydDo6UmVxdWVzdDo6QXV0bzo6RW1haWw6OkNIRUNLJywKICAgICAgICBUeXBlICAgICAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBDaGFyc2V0ICAgID0+ICd1dGYtOCcsCiAgICAgICAgQm9keSAgICAgICA9PiAkQm9keSwKICAgICAgICBBdHRhY2htZW50ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJExvZ1ByZUZpbGVuYW1lLAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJHsgJExvZ1ByZUNvbnRlbnQgfSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2NoZWNrLnhtbCcsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyAkWE1MQ2hlY2sgfSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3htbCcsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7ICRDb250ZW50IH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEFSQ0hJVkVGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7ICRBUkNISVZFQ29udGVudCB9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkTW9kdWxlQ2hlY2tGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7ICRNb2R1bGVDaGVja0NvbnRlbnQgfSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJExvZ1Bvc3RGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7ICRMb2dQb3N0Q29udGVudCB9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgRG93bmxvYWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFksICR3ZCwgJHlkLCAkZHN0ICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgbXkgJEZpbGVuYW1lID0gIlN1cHBvcnRJbmZvXyRZLSRNLSREIiAuICdfJyAuICIkaC0kbSI7CgogICAgIyBjcmVhdGUgbG9nIHBhY2thZ2UKICAgIG15ICVGaWxlOwogICAgKCRGaWxle0xvZ1ByZUNvbnRlbnR9LCAkRmlsZXtMb2dQcmVGaWxlbmFtZX0pID0gJFNlbGYtPkxvZ0xhc3QoIFR5cGUgPT4gJ2xvZ19wcmUnICk7CgogICAgIyBjcmVhdGUgY2hlY2sgcGFja2FnZQogICAgbXkgJERhdGFIYXNoID0gJFNlbGYtPkFkbWluQ2hlY2tzR2V0KCk7CiAgICAkRmlsZXtDaGVja0NvbnRlbnR9ICA9ICRTZWxmLT5YTUxTdHJpbmdDcmVhdGUoIERhdGFIYXNoID0+ICREYXRhSGFzaCwgKTsKICAgICRGaWxle0NoZWNrRmlsZW5hbWV9ID0gJ2NoZWNrLnhtbCcsCgogICAgIyBjcmVhdGUgYXBwbGljYXRpb24gcGFja2FnZQogICAgKCRGaWxle0FwcENvbnRlbnR9LCAkRmlsZXtBcHBGaWxlbmFtZX0pID0gJFNlbGYtPkFyY2hpdmVBcHBsaWNhdGlvbigpOwoKICAgICMgY3JlYXRlIEFSQ0hJVkUgcGFja2FnZQogICAgKCRGaWxle0FyY2hDb250ZW50fSwgJEZpbGV7QXJjaEZpbGVuYW1lfSkgPSAkU2VsZi0+QVJDSElWRSgpOwoKICAgICMgY3JlYXRlIG1vZHVsZSBjaGVjayBwYWNrYWdlCiAgICAoJEZpbGV7TW9kdWxlQ2hlY2tDb250ZW50fSwgJEZpbGV7TW9kdWxlQ2hlY2tGaWxlbmFtZX0pID0gJFNlbGYtPk1vZHVsZUNoZWNrKCk7CgogICAgIyBjcmVhdGUgbG9nIHBhY2thZ2UKICAgICgkRmlsZXtMb2dQb3N0Q29udGVudH0sICRGaWxle0xvZ1Bvc3RGaWxlbmFtZX0pID0gJFNlbGYtPkxvZ0xhc3QoIFR5cGUgPT4gJ2xvZ19wb3N0JyApOwoKICAgICMgY3JlYXRlIG1haWwgYm9keQogICAgbXkgJEJvZHkgPSAnJzsKICAgIGZvciBteSAkS2V5ICgga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJEJvZHkgLj0gIiRLZXk6JFBhcmFteyRLZXl9XG4iOwogICAgfQogICAgJEJvZHkgLj0gIkZRRE46IiAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJykgLiAiXG4iOwogICAgJEJvZHkgLj0gIlByb2R1Y3Q6IiAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykgLiAnICcKICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdWZXJzaW9uJykgLiAiXG4iOwoKICAgICRGaWxle0JvZHlDb250ZW50fSA9IFwkQm9keTsKICAgICRGaWxle0JvZHlGaWxlbmFtZX0gPSAnQm9keS50eHQnOwoKICAgICMgc2F2ZSBhbmQgY3JlYXRlIGFyY2hpdmUKICAgIG15ICRUZW1wRGlyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKSAuICcvc3VwcG9ydGluZm8vJzsKCiAgICBpZiAoICEgLWQgJFRlbXBEaXIgKSB7CiAgICAgICAgbWtkaXIgJFRlbXBEaXI7CiAgICB9CgogICAgIyByZW1vdmUgYWxsIGZpbGVzCiAgICBteSBATGlzdE9sZCA9IGdsb2IoICRUZW1wRGlyIC4gJy8qJyApOwogICAgZm9yIG15ICRGaWxlIChATGlzdE9sZCkgewogICAgICAgIHVubGluayAkRmlsZTsKICAgIH0KCiAgICBteSBATGlzdDsKICAgIGZvciBteSAkS2V5IChxdyhCb2R5IExvZ1ByZSBDaGVjayBBcHAgQXJjaCBNb2R1bGVDaGVjayBMb2dQb3N0KSApIHsKICAgICAgICBpZiAoICRGaWxleyAkS2V5IC4gJ0ZpbGVuYW1lJyB9ICYmICRGaWxleyAkS2V5IC4gJ0NvbnRlbnQnIH0gKSB7CiAgICAgICAgICAgIG15ICRGaWxlbmFtZSA9ICRUZW1wRGlyIC4gJy8nIC4gJEZpbGV7ICRLZXkgLiAnRmlsZW5hbWUnIH07CiAgICAgICAgICAgIG9wZW4oIG15ICRPdXQsICc+JywgJEZpbGVuYW1lICk7CiAgICAgICAgICAgIGJpbm1vZGUoJE91dCk7CiAgICAgICAgICAgIHByaW50ICRPdXQgJHsgJEZpbGV7ICRLZXkgLiAnQ29udGVudCcgfSB9OwogICAgICAgICAgICBjbG9zZSAkT3V0OwogICAgICAgICAgICBwdXNoIEBMaXN0LCAkRmlsZW5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgbXkgJEFyY2hpdmUgPSAkVGVtcERpciAuICcvJyAuICRGaWxlbmFtZTsKICAgIG15ICRUYXJPYmplY3QgPSBBcmNoaXZlOjpUYXItPm5ldygpOwogICAgJFRhck9iamVjdC0+YWRkX2ZpbGVzKEBMaXN0KTsKICAgICRUYXJPYmplY3QtPndyaXRlKCAkQXJjaGl2ZSwgMCApIHx8IGRpZSAiQ291bGQgbm90IHdyaXRlOiAkXyEiOwoKICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgb3BlbiggbXkgJFRhciwgJzwnLCAkQXJjaGl2ZSApOwogICAgYmlubW9kZSgkVGFyKTsKICAgIG15ICRUbXBUYXIgPSAnJzsKICAgIHdoaWxlICg8JFRhcj4pIHsKICAgICAgICAkVG1wVGFyIC49ICRfOwogICAgfQogICAgY2xvc2UoJFRhcik7CgogICAgIyByZW1vdmUgYWxsIGZpbGVzCiAgICBATGlzdE9sZCA9IGdsb2IoICRUZW1wRGlyIC4gJy8qJyApOwogICAgZm9yIG15ICRGaWxlIChATGlzdE9sZCkgewogICAgICAgIHVubGluayAkRmlsZTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoIkNvbXByZXNzOjpabGliIikgKSB7CiAgICAgICAgbXkgJEd6VGFyID0gQ29tcHJlc3M6OlpsaWI6Om1lbUd6aXAoJFRtcFRhcik7CiAgICAgICAgcmV0dXJuICggXCRHelRhciwgJEZpbGVuYW1lIC4gJy50YXIuZ3onKTsKICAgIH0KCiAgICByZXR1cm4gKCBcJFRtcFRhciwgJEZpbGVuYW1lIC4gJy50YXInICk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTYgJCAkRGF0ZTogMjAwOC8wNy8yMiAwODozNjo0MCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGFiYXNlLnBtLHYgMS45IDIwMDgvMDcvMTMgMjM6MjU6NDEgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZSAtIGdsb2JhbCBzeXN0ZW0gaW5mb3JtYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbiB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgRGF0YWJhc2UgaW5mbyBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCiAgICAkU3lzdGVtSW5mb09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggQWRtaW5DaGVja3MgaW5mb3JtYXRpb24uCgokRGF0YWJhc2VBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07Cgo9Y3V0CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YUFycmF5ID0gW107CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZGF0YWJhc2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiAgICAjICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwogICAgIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IHVzZWQgZGF0YWJhc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHRyeSB0byBmaW5kIG91dCB3aGljaCB0aWNrZXQgZGF0YWJhc2UgaXMgY29uZmlndXJlZAogICAgbXkgJERhdGFiYXNlVHlwZSA9ICRTZWxmLT57REJPYmplY3R9LT57J0RCOjpUeXBlJ307CgogICAgIyB0cnkgdG8gZ2V0IGF2YWlsaWJsZSBtb2R1bGVzIGFuZCB0aGUgZGlyZWN0b3J5IG5hbWUKICAgIG15ICREaXJOYW1lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvS2VybmVsL1N5c3RlbS9TdXBwb3J0L0RhdGFiYXNlIjsKCiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoICREaXJOYW1lIC4gIi8qLnBtIiApOwogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgaWYgKCAkRGF0YWJhc2VUeXBlID1+IC9PREJDL2kgKSB7CiAgICAgICAgICAgICREYXRhYmFzZVR5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGF0YWJhc2U6OlR5cGUnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRGF0YWJhc2VUeXBlID1+IC9eJEZpbGUvaSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjokRmlsZSI7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKICAgICAgICAgICAgICAgIGlmICgkU3VwcG9ydE9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5BZG1pbkNoZWNrc0dldCgpOwogICAgICAgICAgICAgICAgICAgIGlmICggJEFycmF5UmVmICYmIHJlZigkQXJyYXlSZWYpIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7JERhdGFBcnJheX0sIEB7JEFycmF5UmVmfSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIF9DaGVjaygpCgpyZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBDaGVjayBpbmZvcm1hdGlvbi4KCiRDaGVja0hhc2ggPT4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9OwoKIyBjaGVjayBpZiBjb25maWcgdmFsdWUgYXZhaWxpYmxlCmlmICgkUGFyYW17VHlwZX0pIHsKICAgIHByaW50IFNUREVSUiAiVFlQRTogIiAuICRQYXJhbXtUeXBlfTsKfQoKPWN1dAoKc3ViIF9DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICggJF5PID1+IC9saW51eC8gfHwgL3VuaXgvIHx8IC9uZXRic2QvIHx8IC9mcmVlYnNkLyB8fCAvRGFyd2luLyApIHsKCiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7CgogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjkgJCAkRGF0ZTogMjAwOC8wNy8xMyAyMzoyNTo0MSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PUy5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9TLnBtLHYgMS4xMCAyMDA4LzA3LzEzIDIzOjI1OjQxIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpPUzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIG5ldyBmdW5jdGlvbiBuYW1lIGhlcmUKICAgIG15IEBNb2R1bGVMaXN0ID0gKAogICAgICAgICdfQ1BVTG9hZENoZWNrJywgJ19EaXNrVXNhZ2VDaGVjaycsICdfTWVtb3J5U3dhcENoZWNrJywKICAgICAgICAnX0Rpc3RyaWJ1dGlvbkNoZWNrJywgJ19LZXJuZWxJbmZvQ2hlY2snLCAnX1BlcmxDaGVjaycsCiAgICApOwoKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBNb2R1bGVMaXN0KSB7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfRGlzdHJpYnV0aW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCAkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxkYXJ3aW4pL2kgKSB7CiAgICAgICAgbXkgJFRtcExpbmUgPSAiIjsKICAgICAgICBteSAkRGlzdHJpYnV0aW9uOwogICAgICAgIGlmICggb3BlbiggJERpc3RyaWJ1dGlvbiwgJzwnLCAiL2V0Yy9pc3N1ZSIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkRGlzdHJpYnV0aW9uPikgewogICAgICAgICAgICAgICAgJFRtcExpbmUgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJERpc3RyaWJ1dGlvbik7CiAgICAgICAgICAgIGlmICgkVG1wTGluZSkgewogICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9cXC4qLy87CiAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL1xuLy9nOwogICAgICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNob3dzIHRoZSB1c2VkIGRpc3RyaWJ1dGlvbi4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJcIiRUbXBMaW5lXCIgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEaXN0cmlidXRpb24nLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNob3dzIHRoZSB1c2VkIGRpc3RyaWJ1dGlvbi4iLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbrRcJ3QgZmluZCAvZXRjL2lzc3VlLi4uIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJF5PID1+IC8od2lufGZyZWVic2QpL2kgKSB7CiAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEaXN0cmlidXRpb24nLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICIkXk8gaXMgdXNlZC4iLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnT0snLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBfS2VybmVsSW5mb0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICggJF5PID1+IC8obGludXh8dW5peHxuZXRic2R8ZnJlZWJzZHxkYXJ3aW4pL2kgKSB7CiAgICAgICAgbXkgJFRtcExpbmUgPSAiIjsKICAgICAgICBteSAkS2VybmVsSW5mbzsKICAgICAgICBpZiAoIG9wZW4oICRLZXJuZWxJbmZvLCAidW5hbWUgLWEgfCIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkS2VybmVsSW5mbz4pIHsKICAgICAgICAgICAgICAgICRUbXBMaW5lIC49ICRfOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRLZXJuZWxJbmZvKTsKICAgICAgICAgICAgaWYgKCRUbXBMaW5lKSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL15ccysvL2c7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnS2VybmVsIFZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBLZXJuZWwgdmVyc2lvbi4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJcIiRUbXBMaW5lXCIgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdLZXJuZWwgVmVyc2lvbicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgS2VybmVsIHZlcnNpb24uIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW60XCd0IGV4ZWN1dGUgdW5hbWUgLWEuLi4iLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkXk8gPX4gL3dpbi9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9QZXJsQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgY2hlY2sgdmVyaXNvbiBzdHJpbmcKICAgIG15ICRWZXJzaW9uID0gc3ByaW50ZiAiJXZkIiwgJF5WOwogICAgbXkgJE9TICAgICAgPSBzcHJpbnRmICIkXk8iLCAkXlY7CiAgICBpZiAoICRWZXJzaW9uID1+IC8oXGQrKVwuKFxkKylcLihcZCspL2kgKSB7CiAgICAgICAgaWYgKCAkMSA8PSA1ICYmICQyIDw9IDggJiYgJDMgPD0gNyApIHsKICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUGVybENoZWNrJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBQZXJsIFZlcnNpb24uIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJQZXJsICRWZXJzaW9uICgkT1MpIGlzIHRvIG9sZCwgeW91IHNob3VsZCB1cGdyYWRlIHRvIFBlcmwgNS44Ljggb3IgaGlnaGVyLiIsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgfTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQZXJsQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIFBlcmwgVmVyc2lvbi4iLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlBlcmwgJFZlcnNpb24gKCRPUykgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BlcmxDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBQZXJsIFZlcnNpb24uIiwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlVuYWJsZSB0byBwYXJzZSB2ZXJzaW8gc3RyaW5nICgkVmVyc2lvbiAvICRPUykuIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9NZW1vcnlTd2FwQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgbXkgJE1lbUluZm9GaWxlOwogICAgbXkgJE1lbVRvdGFsOwogICAgbXkgJE1lbUZyZWU7CiAgICBteSAkU3dhcFRvdGFsOwogICAgbXkgJFN3YXBGcmVlOwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCAkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSApIHsKICAgICAgICBpZiAoIG9wZW4oICRNZW1JbmZvRmlsZSwgJzwnLCAiL3Byb2MvbWVtaW5mbyIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkTWVtSW5mb0ZpbGU+KSB7CiAgICAgICAgICAgICAgICBteSAkVG1wTGluZSA9ICRfOwogICAgICAgICAgICAgICAgaWYgKCAkVG1wTGluZSA9fiAvTWVtVG90YWwvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG90YWwgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVG1wTGluZSA9fiAvTWVtRnJlZS8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRNZW1GcmVlID0gaW50KCRUbXBMaW5lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFRtcExpbmUgPX4gL1N3YXBUb3RhbC8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRTd2FwVG90YWwgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVG1wTGluZSA9fiAvU3dhcEZyZWUvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkU3dhcEZyZWUgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRNZW1JbmZvRmlsZSk7CgogICAgICAgICAgICAjIGJ1aWxkIHJldHVybiBoYXNoCiAgICAgICAgICAgIG15ICREZXNjcmlidGlvbgogICAgICAgICAgICAgICAgPSAiVGhlIEhvc3QgU3lzdGVtIGhhczogXG4iCiAgICAgICAgICAgICAgICAuIGludCggJE1lbVRvdGFsIC8gMTAyNCApCiAgICAgICAgICAgICAgICAuICIgTUIgTWVtb3J5IHRvdGFsIFxuIgogICAgICAgICAgICAgICAgLiBpbnQoICRNZW1GcmVlIC8gMTAyNCApCiAgICAgICAgICAgICAgICAuICIgTUIgTWVtb3J5IGZyZWUgXG4iCiAgICAgICAgICAgICAgICAuIGludCggJFN3YXBUb3RhbCAvIDEwMjQgKQogICAgICAgICAgICAgICAgLiAiIE1CIFN3YXAgdG90YWwgXG4iCiAgICAgICAgICAgICAgICAuIGludCggJFN3YXBGcmVlIC8gMTAyNCApCiAgICAgICAgICAgICAgICAuICIgTUIgU3dhcCBmcmVlICI7CgogICAgICAgICAgICBpZiAoICEkU3dhcFRvdGFsICkgewogICAgICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ01lbW9yeSBTd2FwIENoZWNrJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQSBNZW1vcnkgQ2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIk5vIFN3YXAgZW5hYmxlZCEiLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgoICgkU3dhcEZyZWUpIC8gKCRTd2FwVG90YWwpIDwgNjAgKQogICAgICAgICAgICAgICAgfHwgKCAoJFN3YXBUb3RhbCkgLSAoJFN3YXBGcmVlKSA+IDIwMDAwICkgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTWVtb3J5IFN3YXAgQ2hlY2snLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiU3dhcEZyZWUgOiBTd2FwVG90YWwgPCA2MCAlICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAiJERlc2NyaWJ0aW9uIiwKICAgICAgICAgICAgICAgICAgICBDaGVjayAgID0+ICdPSycsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ01lbW9yeSBTd2FwIENoZWNrJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQSBNZW1vcnkgQ2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9DUFVMb2FkQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSBAU3BsaXRBcnJheSA9IHt9OwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCAkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSApIHsKICAgICAgICBpZiAoIC1lICIvcHJvYy9sb2FkYXZnIiApIHsKICAgICAgICAgICAgbXkgJExvYWRGaWxlOwogICAgICAgICAgICBvcGVuKCAkTG9hZEZpbGUsICc8JywgIi9wcm9jL2xvYWRhdmciICk7CiAgICAgICAgICAgIHdoaWxlICg8JExvYWRGaWxlPikgewogICAgICAgICAgICAgICAgQFNwbGl0QXJyYXkgPSBzcGxpdCggIiAiLCAkXyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRMb2FkRmlsZSk7CgogICAgICAgICAgICAjIGJ1aWxkIHJldHVybiBoYXNoCiAgICAgICAgICAgIG15ICREZXNjcmlidGlvbgogICAgICAgICAgICAgICAgPSAiVGhlIEhvc3QgU3lzdGVtIGhhcyBhIGxvYWQ6IFxuIgogICAgICAgICAgICAgICAgLiAkU3BsaXRBcnJheVswXQogICAgICAgICAgICAgICAgLiAiIGluIHRoZSBsYXN0IDEgbWludXRlIFxuIgogICAgICAgICAgICAgICAgLiAkU3BsaXRBcnJheVsxXQogICAgICAgICAgICAgICAgLiAiIGluIHRoZSBsYXN0IDUgbWludXRlcyBcbiIKICAgICAgICAgICAgICAgIC4gJFNwbGl0QXJyYXlbMl0KICAgICAgICAgICAgICAgIC4gIiBpbiB0aGUgbGFzdCAxNSBtaW51dGVzIjsKCiAgICAgICAgICAgIGlmICggJFNwbGl0QXJyYXlbMl0gPCAnMS4wMCcgKSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnQ1BVIExvYWQnLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJBIENQVSBsb2FkIGNoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJ0aGUgc3lzdGVtIGxvYWQgaW4gdGhlIGxhc3QgMTUgbWludXRlcyA+IDEuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICIkRGVzY3JpYnRpb24iLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnQ1BVIExvYWQnLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJBIENQVSBsb2FkIGNoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJ0aGUgc3lzdGVtIGxvYWQgaW4gdGhlIGxhc3QgMTUgbWludXRlcyA8IDEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgX0Rpc2tVc2FnZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgICAgPSB7fTsKICAgIG15ICRDaGVjayAgID0gJ09LJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoICReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGZyZWVic2R8ZGFyd2luKS9pICkgewogICAgICAgIG15ICRJbjsKICAgICAgICBpZiAoIG9wZW4oICRJbiwgImRmIC1sIHwiICkgKSB7CiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgaWYgKCAkXyA9fiAvXiguKz8pXHMuKlxzKFxkXGRcZHxcZFxkfFxkKSUuKz8kLyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICQyID4gOTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICRDaGVjayBuZSAnRmFpbGVkJyAmJiAkMiA+IDg1ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiwiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiJDFcWyQyJVxdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBpZiAoICRDaGVjayBlcSAnRmFpbGVkJyApIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIkRpc2sgaXMgZnVsbCAoJE1lc3NhZ2UpLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJEaXNrIHVzYWdlICgkTWVzc2FnZSkuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc2sgVXNhZ2UnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgZGlzayB1c2FnZS4iLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICAgICAgcmV0dXJuICREYXRhOwogICAgfQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9Dcm9uLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3Jvbi5wbSx2IDEuMyAyMDA4LzA3LzEzIDIzOjI1OjQxIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpDcm9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpDcm9uIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uIHRvIGEgcnVubmluZyBPVFJTIGhvc3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBDcm9uIGluZm8gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CgogICAgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6Q3Jvbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJENyb25BcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07Cgo9Y3V0CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCBuZXcgZnVuY3Rpb24gbmFtZSBoZXJlCiAgICBteSBATW9kdWxlTGlzdCA9ICgpOwoKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBNb2R1bGVMaXN0KSB7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCj1pdGVtIF9DaGVjaygpCgpyZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBDaGVjayBpbmZvcm1hdGlvbi4KCiRDaGVja0hhc2ggPT4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9OwoKIyBjaGVjayBpZiBjb25maWcgdmFsdWUgYXZhaWxpYmxlCmlmICgkUGFyYW17VHlwZX0pIHsKICAgIHByaW50IFNUREVSUiAiVFlQRTogIiAuICRQYXJhbXtUeXBlfTsKfQoKPWN1dAoKc3ViIF9DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICggJF5PID1+IC9saW51eC8gfHwgL3VuaXgvIHx8IC9uZXRic2QvIHx8IC9mcmVlYnNkLyB8fCAvRGFyd2luLyApIHsKCiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7ICAgICMgVE9ETyAvIEF1c2dhYmUgdW50ZXIgV2luZG93cyBub2NoIHBydWVmZW4KCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PVFJTLnBtIC0gYWxsIHJlcXVpcmVkIG90cnMgaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9UUlMucG0sdiAxLjE1IDIwMDgvMDcvMTMgMjM6MjU6NDEgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9UUlM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlBhY2thZ2U7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBEQk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e1N1cHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntQYWNrYWdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpQYWNrYWdlLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIG5ldyBmdW5jdGlvbiBuYW1lIGhlcmUKICAgIG15IEBNb2R1bGVMaXN0ID0gKAogICAgICAgICdfT3BlblRpY2tldENoZWNrJywgJ19UaWNrZXRJbmRleE1vZHVsZUNoZWNrJywgJ19UaWNrZXRGdWxsdGV4dEluZGV4TW9kdWxlQ2hlY2snLAogICAgICAgICdfRlFETkNvbmZpZ0NoZWNrJywgJ19TeXN0ZW1JRENvbmZpZ0NoZWNrJywgJ19Mb2dDaGVjaycsCiAgICAgICAgJ19GaWxlU3lzdGVtQ2hlY2snLCAnX1BhY2thZ2VEZXBsb3lDaGVjaycsCiAgICApOwoKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBNb2R1bGVMaXN0KSB7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCiMgY2hlY2sgaWYgZXJyb3IgbG9nIGVudHJpZXMgYXJlIGF2YWlsYWJsZQpzdWIgX0xvZ0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIFRpY2tldDo6SW5kZXhNb2R1bGUgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ09LJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkRXJyb3IgICA9ICcnOwoKICAgIG15IEBMaW5lcyA9IHNwbGl0KCAvXG4vLCAkU2VsZi0+e0xvZ09iamVjdH0tPkdldExvZygpICk7CiAgICBmb3IgKEBMaW5lcykgewogICAgICAgIG15IEBSb3cgPSBzcGxpdCggLzs7LywgJF8gKTsKICAgICAgICBpZiAoICRSb3dbM10gKSB7CiAgICAgICAgICAgIGlmICggJFJvd1sxXSA9fiAvZXJyb3IvaSApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAnWW91IGhhdmUgbW9yZSBlcnJvciBsb2cgZW50cmllczogJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlID0gJ1RoZXJlIGlzIG9uZSBlcnJvciBsb2cgZW50cnk6ICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yIC49ICcsICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3IgLj0gJFJvd1szXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnTG9nQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBsb2cgZm9yIGVycm9yIGxvZyBlbnRyaWVzLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UgLiAkRXJyb3IsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UaWNrZXRJbmRleE1vZHVsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIFRpY2tldDo6SW5kZXhNb2R1bGUgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgbXkgJE1vZHVsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpJbmRleE1vZHVsZScpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnU0VMRUNUIGNvdW50KCopIGZyb20gdGlja2V0JyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPiA4MDAwMCApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlID1+IC9SdW50aW1lREIvICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzBdIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uIFlvdSBzaG91bGQgdXNlIHRoZSBTdGF0aWNEQiBiYWNrZW5kLiBTZWUgYWRtaW4gbWFudWFsIChQZXJmb3JtYW5jZSBUdW5pbmcpIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJvd1swXSA+IDYwMDAwICkgewogICAgICAgICAgICBpZiAoICRNb2R1bGUgPX4gL1J1bnRpbWVEQi8gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1swXSB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZC4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3UgYXJlIHVzaW5nIFwiJE1vZHVsZVwiLCB0aGF0J3MgZmluZSBmb3IgJFJvd1swXSB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiI7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RpY2tldDo6SW5kZXhNb2R1bGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBUaWNrZXQ6OkluZGV4TW9kdWxlIHNldHRpbmcuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RpY2tldEZ1bGx0ZXh0SW5kZXhNb2R1bGVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBUaWNrZXQ6OkluZGV4TW9kdWxlIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICRNb2R1bGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VhcmNoSW5kZXhNb2R1bGUnKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIGFydGljbGUnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA+IDEwMDAwMCApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlID1+IC9SdW50aW1lREIvICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzBdIGFydGljbGUgaW4geW91ciBzeXN0ZW0uIFlvdSBzaG91bGQgdXNlIHRoZSBTdGF0aWNEQiBiYWNrZW5kIGZvciBPVFJTIDIuMyBhbmQgaGlnaGVyLiBTZWUgYWRtaW4gbWFudWFsIChQZXJmb3JtYW5jZSBUdW5pbmcpIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJvd1swXSA+IDUwMDAwICkgewogICAgICAgICAgICBpZiAoICRNb2R1bGUgPX4gL1J1bnRpbWVEQi8gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1swXSBhcnRpY2xlIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZCBmb3IgT1RSUyAyLjMgYW5kIGhpZ2hlci4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3UgYXJlIHVzaW5nIFwiJE1vZHVsZVwiLCB0aGF0J3MgZmluZSBmb3IgJFJvd1swXSBhcnRpY2xlIGluIHlvdXIgc3lzdGVtLiI7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RpY2tldDo6U2VhcmNoSW5kZXhNb2R1bGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlIHNldHRpbmcuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgojIE9wZW5UaWNrZXRDaGVjayBjaGVjawpzdWIgX09wZW5UaWNrZXRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgICA9ICcnOwogICAgbXkgQFRpY2tldElEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICAgICBTdGF0ZVR5cGUgID0+ICdPcGVuJywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgIExpbWl0ICAgICAgPT4gODk5OTksCiAgICApOwogICAgaWYgKCAkI1RpY2tldElEcyA+IDg5OTkwICkgewogICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBzaG91bGQgbm90IGhhdmUgbW9yZSB0aGVuIDgwMDAgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3UgY3VycmVudGx5IGhhdmUgb3ZlciA4OTk5OSEgSW4gY2FzZSB5b3Ugd2FudCB0byBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UsIGNsb3NlIG5vdCBuZWVkZWQgb3BlbiB0aWNrZXRzLic7CgogICAgfQogICAgZWxzaWYgKCAkI1RpY2tldElEcyA+IDEwMDAwICkgewogICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBzaG91bGQgbm90IGhhdmUgbW9yZSB0aGVuIDgwMDAgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3UgY3VycmVudGx5IGhhdmUgJwogICAgICAgICAgICAuICQjVGlja2V0SURzCiAgICAgICAgICAgIC4gJy4gSW4gY2FzZSB5b3Ugd2FudCB0byBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UsIGNsb3NlIG5vdCBuZWVkZWQgb3BlbiB0aWNrZXRzLic7CgogICAgfQogICAgZWxzaWYgKCAkI1RpY2tldElEcyA+IDgwMDAgKSB7CiAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAkTWVzc2FnZSA9ICdZb3Ugc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhlbiA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlICcKICAgICAgICAgICAgLiAkI1RpY2tldElEcwogICAgICAgICAgICAuICcuIEluIGNhc2UgeW91IHdhbnQgdG8gaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlLCBjbG9zZSBub3QgbmVlZGVkIG9wZW4gdGlja2V0cy4nOwoKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAkTWVzc2FnZSA9ICdZb3UgaGF2ZSAnIC4gJCNUaWNrZXRJRHMgLiAnIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4nOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ09wZW5UaWNrZXRDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCiMgQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyZWQgRlFETiBpcyB2YWxpZC4Kc3ViIF9GUUROQ29uZmlnQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdGUUROQ29uZmlnQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBpZiB0aGUgY29uZmlndXJlZCBmdWxseSBxdWFsaWZpZWQgaG9zdCBuYW1lIGlzIHZhbGlkLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJycsCiAgICB9OwoKICAgICMgR2V0IHRoZSBjb25maWd1cmVkIEZRRE4KICAgIG15ICRGUUROID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZRRE4nKTsKCiAgICAjIERvIHdlIGhhdmUgc2V0IG91ciBGUUROPwogICAgaWYgKCAkRlFETiBlcSAneW91cmhvc3QuZXhhbXBsZS5jb20nICkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnRmFpbGVkJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIlBsZWFzZSBjb25maWd1cmUgeW91ciBGUUROIChpdCdzIGN1cnJlbnRseSBkZWZhdWx0IHNldHRpbmcgJyRGUUROJykuIjsKICAgIH0KCiAgICAjIEZRRE4gc3ludGF4IGNoZWNrLgogICAgZWxzaWYgKCAkRlFETiA9fiAvXC5cLnxcc3xbXmEtekEtWjAtOS0uXS9nICkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnRmFpbGVkJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIkludmFsaWQgRlFETiAnJEZRRE4nLiI7CiAgICB9CgogICAgIyBOb3RoaW5nIHRvIGNvbXBsYWluLiA6LSgKICAgIGVsc2UgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnT0snOwogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiRlFETiAnJEZRRE4nIGxvb2tzIGdvb2QuIjsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKIyBDaGVjayBpZiB0aGUgU3lzdGVtSUQgY29udGFpbnMgb25seSBkaWdpdHMuCnN1YiBfU3lzdGVtSURDb25maWdDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdTeXN0ZW1JRENvbmZpZ0NoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyZWQgU3lzdGVtSUQgY29udGFpbnMgb25seSBkaWdpdHMuJywKICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICBDb21tZW50ICAgICA9PiAnJywKICAgIH07CgogICAgIyBHZXQgdGhlIGNvbmZpZ3VyZWQgU3lzdGVtSUQKICAgIG15ICRTeXN0ZW1JRCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpOwoKICAgICMgRG9lcyB0aGUgU3lzdGVtSUQgY29udGFpbiBub24tZGlnaXRzPwogICAgaWYgKCAkU3lzdGVtSUQgPX4gL15cZCskLyApIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ09LJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiVGhlIFN5c3RlbUlEICckU3lzdGVtSUQnIG11c3QgY29uc2lzdCBvZiBkaWdpdHMgZXhjbHVzaXZlbHkuIjsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9GaWxlU3lzdGVtQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0ZpbGVTeXN0ZW1DaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIGZpbGUgc3lzdGVtIGlzIHdyaXRhYmxlLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJycsCiAgICB9OwoKICAgIG15ICRIb21lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgICMgY2hlY2sgSG9tZQogICAgaWYgKCEgLWUgJEhvbWUpIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ0ZhaWxlZCc7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJObyBzdWNoIGhvbWUgZGlyZWN0b3J5OiAkSG9tZSEiLAogICAgICAgIHJldHVybiAkRGF0YTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KC9iaW4vIC9LZXJuZWwvIC9LZXJuZWwvU3lzdGVtLyAvS2VybmVsL091dHB1dC8gL0tlcm5lbC9PdXRwdXQvSFRNTC8gL0tlcm5lbC9Nb2R1bGVzLykpIHsKICAgICAgICBteSAkRmlsZSA9ICIkSG9tZS8kXy9jaGVja19wZXJtaXNzb25zLiQkIjsKICAgICAgICBpZiAob3BlbihPVVQsICI+ICRGaWxlIikpIHsKICAgICAgICAgICAgcHJpbnQgT1VUICJ0ZXN0IjsKICAgICAgICAgICAgY2xvc2UgKE9VVCk7CiAgICAgICAgICAgIHVubGluayAkRmlsZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlIC49ICIkRmlsZSgkISk7IjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJDYW4ndCB3cml0ZSBmaWxlOiAkTWVzc2FnZSIsCiAgICAgICAgcmV0dXJuICREYXRhOwogICAgfQoKICAgICREYXRhLT57Q2hlY2t9ICAgPSAnT0snOwoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9QYWNrYWdlRGVwbG95Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BhY2thZ2VEZXBsb3lDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRlcGxveW1lbnQgb2YgYWxsIHBhY2thZ2VzLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJycsCiAgICB9OwoKICAgIGZvciBteSAkUGFja2FnZSAoICRTZWxmLT57UGFja2FnZU9iamVjdH0tPlJlcG9zaXRvcnlMaXN0KCkgKSB7CiAgICAgICAgbXkgJERlcGxveUNoZWNrID0gJFNlbGYtPntQYWNrYWdlT2JqZWN0fS0+RGVwbG95Q2hlY2soCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFBhY2thZ2UtPntOYW1lfS0+e0NvbnRlbnR9LAogICAgICAgICAgICBWZXJzaW9uID0+ICRQYWNrYWdlLT57VmVyc2lvbn0tPntDb250ZW50fSwKICAgICAgICApOwogICAgICAgIGlmICggISREZXBsb3lDaGVjayApIHsKICAgICAgICAgICAgJE1lc3NhZ2UgLj0gJFBhY2thZ2UtPntOYW1lfS0+e0NvbnRlbnR9IC4gJyAnIC4gJFBhY2thZ2UtPntWZXJzaW9ufS0+e0NvbnRlbnR9IC4gJzsnOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIlBhY2thZ2VzIG5vdCBjb3JyZWN0bHkgaW5zdGFsbGVkOiAkTWVzc2FnZSIsCiAgICAgICAgcmV0dXJuICREYXRhOwogICAgfQoKICAgICREYXRhLT57Q2hlY2t9ICAgPSAnT0snOwoKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvSUlTLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSUlTLnBtLHYgMS42IDIwMDgvMDcvMTMgMjM6MjU6NDEgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6SUlTOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCBuZXcgZnVuY3Rpb24gbmFtZSBoZXJlCiAgICBteSBATW9kdWxlTGlzdCA9ICgKICAgICAgICAnX1BlcmxFeENoZWNrJywKICAgICk7CgogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQE1vZHVsZUxpc3QpIHsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0Kc3ViIF9QZXJsRXhDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBjaGVjayBpZiBBcGFjaGU6OkRCSSBpcyBsb2FkZWQKICAgIG15ICRDaGVjayAgICAgPSAnJzsKICAgIG15ICRNZXNzYWdlICAgPSAnJzsKICAgIGlmICggJEVOVnsnR0FURVdBWV9JTlRFUkZBQ0UnfSAmJiAkRU5WeydHQVRFV0FZX0lOVEVSRkFDRSd9ID1+IC9eQ0dJLVBlcmxFeC9pICkgewogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAkTWVzc2FnZSA9ICJQZXJsRXggaXMgaW4gdXNlICgkRU5WeydHQVRFV0FZX0lOVEVSRkFDRSd9KS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBzaG91bGQgdXNlIFBlcmxFeCB0byBpbmNyZWFzZSB5b3VyIHBlcmZvcm1hbmNlICh5b3UgcmVhbGx5IHNob3VsZCBkbyB0aGlzKS4nOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BlcmxFeCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIFBlcmxFeCBpcyB1c2VkLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvQXBhY2hlLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQXBhY2hlLnBtLHYgMS45IDIwMDgvMDcvMTMgMjM6MjU6NDEgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6QXBhY2hlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCBuZXcgZnVuY3Rpb24gbmFtZSBoZXJlCiAgICBteSBATW9kdWxlTGlzdCA9ICgKICAgICAgICAnX0FwYWNoZURCSUNoZWNrJywgJ19BcGFjaGVSZWxvYWRDaGVjaycsCiAgICAgICAgJ19Nb2RQZXJsVmVyc2lvbkNoZWNrJywKICAgICk7CgogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQE1vZHVsZUxpc3QpIHsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9BcGFjaGVEQklDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBjaGVjayBpZiBBcGFjaGU6OkRCSSBpcyBsb2FkZWQKICAgIG15ICRBcGFjaGVEQkkgPSAwOwogICAgbXkgJENoZWNrICAgICA9ICcnOwogICAgbXkgJE1lc3NhZ2UgICA9ICcnOwogICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICVJTkMgKSB7CiAgICAgICAgJE1vZHVsZSA9fiBzL1wvLzo6L2c7CiAgICAgICAgJE1vZHVsZSA9fiBzL1wucG0kLy9nOwogICAgICAgIGlmICggJE1vZHVsZSBlcSAnQXBhY2hlOjpEQkknIHx8ICRNb2R1bGUgZXEgJ0FwYWNoZTI6OkRCSScgKSB7CiAgICAgICAgICAgICRBcGFjaGVEQkkgPSAkTW9kdWxlOwogICAgICAgIH0KICAgIH0KICAgIGlmICggISRBcGFjaGVEQkkgKSB7CiAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAkTWVzc2FnZSA9ICdBcGFjaGU6OkRCSSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYSBiZXR0ZXIgcGVyZm9ybWFuY2UgKHByZSBlc3RhYmxpc2ggZGF0YWJhc2UgY29ubmVjdGlvbnMpLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAkQXBhY2hlREJJOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FwYWNoZTo6REJJJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgdXNlZCBBcGFjaGU6OkRCSS4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQXBhY2hlUmVsb2FkQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgcmVsb2FkIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIGlmICggJEVOVntNT0RfUEVSTH0gKSB7CiAgICAgICAgZXZhbCAicmVxdWlyZSBtb2RfcGVybCI7CiAgICAgICAgaWYgKCBkZWZpbmVkICRtb2RfcGVybDo6VkVSU0lPTiApIHsKICAgICAgICAgICAgaWYgKCAkbW9kX3Blcmw6OlZFUlNJT04gPj0gMS45OSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIEFwYWNoZTo6UmVsb2FkIGlzIGxvYWRlZAogICAgICAgICAgICAgICAgbXkgJEFwYWNoZVJlbG9hZCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJUlOQyApIHsKICAgICAgICAgICAgICAgICAgICAkTW9kdWxlID1+IHMvXC8vOjovZzsKICAgICAgICAgICAgICAgICAgICAkTW9kdWxlID1+IHMvXC5wbSQvL2c7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTW9kdWxlIGVxICdBcGFjaGU6OlJlbG9hZCcgfHwgJE1vZHVsZSBlcSAnQXBhY2hlMjo6UmVsb2FkJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFwYWNoZVJlbG9hZCA9ICRNb2R1bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJEFwYWNoZVJlbG9hZCApIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlID0gJ0FwYWNoZTo6UmVsb2FkIG9yIEFwYWNoZTI6OlJlbG9hZCBzaG91bGQgYmUgdXNlZCBhcyBQZXJsTW9kdWxlIGFuZCBQZXJsSW5pdEhhbmRsZXIgaW4gQXBhY2hlIGNvbmZpZyBmaWxlLic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkQXBhY2hlUmVsb2FkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBzaG91bGQgdXNlIG1vZF9wZXJsIHRvIGluY3JlYXNlIHlvdXIgcGVyZm9ybWFuY2UgdmVyeSBzdHJvbmchJzsKICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdBcGFjaGU6OlJlbG9hZCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIHVzZWQgQXBhY2hlOjpSZWxvYWQvQXBhY2hlMjo6UmVsb2FkLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9Nb2RQZXJsVmVyc2lvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIGNoZWNrIG1vZF9wZXJsIHZlcnNpb24KICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgaWYgKCAkRU5We01PRF9QRVJMfSApIHsKICAgICAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ID1+IC9cLzEuOTkvICkgewogICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3UgdXNlIGEgYmV0YSB2ZXJzaW9uIG9mIG1vZF9wZXJsICgkRU5We01PRF9QRVJMfSksIHlvdSBzaG91bGQgdXBncmFkZSB0byBhIHN0YWJsZSB2ZXJzaW9uLiI7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEVOVntNT0RfUEVSTH0gPX4gL1wvMS8gKSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91IHNob3VsZCB1cGRhdGUgbW9kX3BlcmwgdG8gMi54ICgkRU5We01PRF9QRVJMfSkuIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAkRU5We01PRF9QRVJMfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgJE1lc3NhZ2UgPSAnWW91IHNob3VsZCB1c2UgbW9kX3BlcmwgdG8gaW5jcmVhc2UgeW91ciBwZXJmb3JtYW5jZSAoeW91IHJlYWxseSBzaG91bGQgZG8gdGhpcykuJzsKICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdWZXJzaW9uIChtb2RfcGVybCknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayB1c2VkIG1vZF9wZXJsIHZlcnNpb24uJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9vcmFjbGUucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBvcmFjbGUucG0sdiAxLjEzIDIwMDgvMDcvMTUgMTk6NTQ6MzcgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjpvcmFjbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e1hNTE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIG5ldyBmdW5jdGlvbiBuYW1lIGhlcmUKICAgIG15IEBNb2R1bGVMaXN0ID0gKAogICAgICAgICdfVGFibGVDaGVjaycsICdfTkxTRGF0ZUZvcm1hdENoZWNrJywKICAgICAgICAnX09yYWNsZUhvbWVDaGVjaycsICdfTkxTTGFuZ0NoZWNrJywKICAgICAgICAnX05MU0RhdGVGb3JtYXRTZWxlY3RDaGVjaycsCiAgICApOwoKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBNb2R1bGVMaXN0KSB7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfT3JhY2xlSG9tZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIGNoZWNrIE9SQUNMRV9IT01FCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gT1JBQ0xFX0hPTUUgZm91bmQhJzsKICAgIGlmICggJEVOVntPUkFDTEVfSE9NRX0gKSB7CiAgICAgICAgaWYgKCAhLWUgJEVOVntPUkFDTEVfSE9NRX0gKSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIk9SQUNMRV9IT01FIGRvbid0IGV4aXN0cyAoJEVOVntPUkFDTEVfSE9NRX0pIjsKICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7T1JBQ0xFX0hPTUV9IjsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdPUkFDTEVfSE9NRScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIE9SQUNMRV9IT01FLiIsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICAgICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX05MU0xhbmdDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgTkxTX0xBTkcKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyBOTFNfTEFORyBmb3VuZCEnOwogICAgaWYgKCAkRU5We05MU19MQU5HfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Q2hhcnNldCcpID1+IC91dGYoXC04fDgpL2kgKSB7CiAgICAgICAgICAgIGlmICggJEVOVntOTFNfTEFOR30gIX4gL3V0ZihcLTh8OCkvICkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJEVOVntOTFNfTEFOR30sIG5lZWQgLnV0ZjggaW4gTkxTX0xBTkcgKGUuIGcuIGdlcm1hbl9nZXJtYW55LnV0ZjgpIjsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkRU5We05MU19MQU5HfSI7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TkxTX0xBTkd9IjsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgIH0KICAgIH0KICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdOTFNfTEFORycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIE5MU19MQU5HLiIsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICAgICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX05MU0RhdGVGb3JtYXRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgTkxTX0RBVEVfRk9STUFUCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gTkxTX0RBVEVfRk9STUFUIGZvdW5kISc7CiAgICBpZiAoICRFTlZ7TkxTX0RBVEVfRk9STUFUfSApIHsKICAgICAgICBpZiAoICRFTlZ7TkxTX0RBVEVfRk9STUFUfSBuZSAiWVlZWS1NTS1ERCBISDI0Ok1JOlNTIiApIHsKICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgID0gIiRFTlZ7TkxTX0RBVEVfRk9STUFUfSwgbmVlZCAnWVlZWS1NTS1ERCBISDI0Ok1JOlNTJyBmb3IgTkxTX0RBVEVfRk9STUFUIChub3QgJEVOVntOTFNfREFURV9GT1JNQVR9KSI7CiAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJEVOVntOTFNfREFURV9GT1JNQVR9IjsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgIH0KICAgIH0KICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdOTFNfREFURV9GT1JNQVQnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBOTFNfREFURV9GT1JNQVQuIiwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX05MU0RhdGVGb3JtYXRTZWxlY3RDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgTkxTX0RBVEVfRk9STUFUCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gTkxTX0RBVEVfRk9STUFUIHNlZW1zIHRvIGJlIHdyb25nISc7CiAgICBteSAkQ3JlYXRlVGltZTsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICJTRUxFQ1QgY3JlYXRlX3RpbWUgRlJPTSB2YWxpZCIsIExpbWl0ID0+IDEgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENyZWF0ZVRpbWUgPSAkUm93WzBdOwogICAgfQoKICAgIGlmICggJENyZWF0ZVRpbWUgKSB7CiAgICAgICAgaWYgKCAkQ3JlYXRlVGltZSAhfiAvXlxkXGRcZFxkLShcZHxcZFxkKS0oXGR8XGRcZClccyhcZHxcZFxkKTooXGR8XGRcZCk6KFxkfFxkXGQpLyApIHsKICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgID0gIiRDcmVhdGVUaW1lIG5vdCBpbiAneXl5eS1tbS1kZCBoaDptbTo6c3MnIGZvcm1hdCAocGxlYXNlIGNoZWNrIFwkRU5We05MU19EQVRFX0ZPUk1BVH0pIjsKICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTWVzc2FnZSA9ICIiOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05MU19EQVRFX1NFTEVDVF9GT1JNQVQnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBOTFNfREFURV9GT1JNQVQgYnkgdXNpbmcgU0VMRUNUIC4uLiIsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHRhYmxlIGNoZWNrCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiL3NjcmlwdHMvZGF0YWJhc2Uvb3Rycy1zY2hlbWEueG1sIjsKICAgIGlmICggLWYgJEZpbGUgKSB7CiAgICAgICAgbXkgJENvdW50ICAgPSAwOwogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICAgICBteSAkQ29udGVudCA9ICcnOwogICAgICAgIG15ICRJbjsKICAgICAgICBpZiAoIG9wZW4oICRJbiwgJzwnLCAiJEZpbGUiICkgKSB7CiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goIFN0cmluZyA9PiAkQ29udGVudCApOwogICAgICAgICAgICBmb3IgbXkgJFRhYmxlICggQHsgJFhNTEhhc2hbMV0tPntkYXRhYmFzZX0tPlsxXS0+e1RhYmxlfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEQk9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5QcmVwYXJlKCBTUUwgPT4gInNlbGVjdCAqIGZyb20gJFRhYmxlLT57TmFtZX0iLCBMaW1pdCA9PiAxICkgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRUYWJsZS0+e05hbWV9LCAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlRhYmxlIGRvc24ndCBleGlzdHM6ICRNZXNzYWdlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRDb3VudCBUYWJsZXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENoZWNrJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLiIsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENoZWNrJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLiIsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAiQ2FuJ3Qgb3BlbiBmaWxlICRGaWxlOiAkISIsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLiIsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBmaW5kIGZpbGUgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9tc3NxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG1zc3FsLnBtLHYgMS45IDIwMDgvMDcvMTMgMjM6MjU6NDEgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjptc3NxbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntYTUxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCBuZXcgZnVuY3Rpb24gbmFtZSBoZXJlCiAgICBteSBATW9kdWxlTGlzdCA9ICgKICAgICAgICAnX1RhYmxlQ2hlY2snLAogICAgKTsKCiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChATW9kdWxlTGlzdCkgewoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwnOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICRGaWxlKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaCggU3RyaW5nID0+ICRDb250ZW50ICk7CiAgICAgICAgICAgIGZvciBteSAkVGFibGUgKCBAeyAkWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRUYWJsZS0+e05hbWV9IGVxICdzeXN0ZW1fdXNlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhYmxlLT57TmFtZX0gPSAnc3lzdGVtX3VzZXIyJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICJzZWxlY3QgKiBmcm9tICRUYWJsZS0+e05hbWV9IiwgTGltaXQgPT4gMSApICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkVGFibGUtPntOYW1lfSwgIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJUYWJsZSBkb3NuJ3QgZXhpc3RzOiAkTWVzc2FnZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkQ291bnQgVGFibGVzIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IG9wZW4gZmlsZSAkRmlsZTogJCEiLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhID0gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAiQ2FuJ3QgZmluZCBmaWxlICRGaWxlISIsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9wb3N0Z3Jlc3FsLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogcG9zdGdyZXNxbC5wbSx2IDEuOCAyMDA4LzA3LzEzIDIzOjI1OjQxIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6cG9zdGdyZXNxbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjggJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntYTUxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCBuZXcgZnVuY3Rpb24gbmFtZSBoZXJlCiAgICBteSBATW9kdWxlTGlzdCA9ICgKICAgICAgICAnX0RhdGVzdHlsZUNoZWNrJywgJ19VVEY4U2VydmVyQ2hlY2snLAogICAgICAgICdfVGFibGVDaGVjaycsICdfVVRGOENsaWVudENoZWNrJywKICAgICAgICAnX1ZlcnNpb25DaGVjaycsCiAgICApOwoKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBNb2R1bGVMaXN0KSB7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfVGFibGVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyB0YWJsZSBjaGVjawogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9zY3JpcHRzL2RhdGFiYXNlL290cnMtc2NoZW1hLnhtbCc7CiAgICBpZiAoIC1mICRGaWxlICkgewogICAgICAgIG15ICRDb3VudCAgID0gMDsKICAgICAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICAgICAgbXkgJENvbnRlbnQgPSAnJzsKICAgICAgICBteSAkSW47CiAgICAgICAgaWYgKCBvcGVuKCAkSW4sICc8JywgJEZpbGUgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaCggU3RyaW5nID0+ICRDb250ZW50ICk7CiAgICAgICAgICAgIGZvciBteSAkVGFibGUgKCBAeyAkWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICJzZWxlY3QgKiBmcm9tICRUYWJsZS0+e05hbWV9IiwgTGltaXQgPT4gMSApICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkVGFibGUtPntOYW1lfSwgIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJUYWJsZSBkb3NuJ3QgZXhpc3RzOiAkTWVzc2FnZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkQ291bnQgVGFibGVzIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IG9wZW4gZmlsZSAkRmlsZTogJCEiLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhID0gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAiQ2FuJ3QgZmluZCBmaWxlICRGaWxlISIsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfRGF0ZXN0eWxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgRGF0ZXN0eWxlIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gRGF0ZVN0eWxlIGZvdW5kISc7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IGFsbCcgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eRGF0ZVN0eWxlL2kgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1sxXSA9fiAvXklTTy9pICkgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1sxXSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiVW5rb3duIERhdGVTdHlsZSAoJFJvd1sxXSkgbmVlZCBJU08uIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdEYXRlU3R5bGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBEYXRlU3R5bGUuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgfSwKICAgICAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVVRGOFNlcnZlckNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHV0Zi04IHNlcnZlciBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnTm8gc2VydmVyX2VuY29kaW5nIGZvdW5kISc7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyBhbGwnICk7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdID1+IC9ec2VydmVyX2VuY29kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJzZXJ2ZXJfZW5jb2RpbmcgZm91bmQgYnV0IGl0J3Mgc2V0IHRvICckUm93WzFdJyAobmVlZCB0byBiZSBVTklDT0RFIG9yIFVURjgpIjsKICAgICAgICAgICAgICAgIGlmICggJFJvd1sxXSA9fiAvKFVOSUNPREV8dXRmKDh8XC04KSkvaSApIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1sxXSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdTZXJ2ZXIgQ29ubmVjdGlvbiAodXRmOCknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgdGhlIHV0Zjggc2VydmVyIGNvbm5lY3Rpb24uJywKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhDbGllbnRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyB1dGYtOCBjbGllbnQgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgPX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgIG15ICRNZXNzYWdlID0gJ05vIGNsaWVudF9lbmNvZGluZyBmb3VuZCEnOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgYWxsJyApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSA9fiAvXmNsaWVudF9lbmNvZGluZy9pICkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiY2xpZW50X2VuY29kaW5nIGZvdW5kIGJ1dCBpdCdzIHNldCB0byAnJFJvd1sxXScgKG5lZWQgdG8gYmUgVU5JQ09ERSBvciBVVEY4KSI7CiAgICAgICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gLyhVTklDT0RFfHV0Zig4fFwtOCkpL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMV0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICREYXRhID0gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnQ2xpZW50IENvbm5lY3Rpb24gKHV0ZjgpJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIHRoZSB1dGY4IGNsaWVudCBjb25uZWN0aW9uLicsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9WZXJzaW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdmVyc2lvbiBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIHZlcnNpb24gZm91bmQhJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgYWxsJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15zZXJ2ZXJfdmVyc2lvbi9pICkgewogICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gL14oXGR7MSwzfSkuKiQvICkgewogICAgICAgICAgICAgICAgaWYgKCAkMSA+IDcgKSB7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMV0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJJdHMgdmVyc2lvbiAkUm93WzFdLCB5b3Ugc2hvdWxkIHVzZSA4Lnggb3IgaGlnbmVyLiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiVW5rb3duIHZlcnNpb24gJFJvd1sxXSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnVmVyc2lvbicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRhdGFiYXNlIHZlcnNpb24uJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9teXNxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG15c3FsLnBtLHYgMS4xNyAyMDA4LzA3LzEzIDIzOjI1OjQxIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6bXlzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e1hNTE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIG5ldyBmdW5jdGlvbiBuYW1lIGhlcmUKICAgIG15IEBNb2R1bGVMaXN0ID0gKAogICAgICAgICdfTWF4QWxsb3dlZFBhY2thZ2VDaGVjaycsICdfUXVlcnlDYWNoZVNpemVDaGVjaycsCiAgICAgICAgJ19UYWJsZUNoZWNrJywgICAgICAgICAgICAgJ19VVEY4U3VwcG9ydENoZWNrJywKICAgICAgICAnX1VURjhDbGllbnRDaGVjaycsICAgICAgICAnX1VURjhEYXRhYmFzZUNoZWNrJywKICAgICAgICAnX1VURjhUYWJsZUNoZWNrJywgICAgICAgICAnX1ZlcnNpb25DaGVjaycsCiAgICApOwoKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBNb2R1bGVMaXN0KSB7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfVmVyc2lvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB2ZXJzaW9uIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gdmVyc2lvbiBmb3VuZCEnOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyB2YXJpYWJsZXMnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIGlmIHJvdyBub3QgdmVyc2lvbiByb3csIG5leHQuCiAgICAgICAgaWYgKCAkUm93WzBdICF+IC9edmVyc2lvbiQvaSApIHsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CgogICAgICAgIGlmICggJFJvd1sxXSA9fiAvXihcZHsxLDN9KVwuKFxkezEsM30pLiokLyApIHsKICAgICAgICAgICAgaWYgKCAkMSA+IDQgfHwgKCAkMSA+IDMgJiYgJDIgPiAwICkgKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJNeVNRTCAkUm93WzFdIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJWZXJzaW9uICRSb3dbMV0sIHlvdSBzaG91bGQgdXNlIDQuMSBvciBoaWduZXIuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiVW5rb3duIHZlcnNpb24gJFJvd1sxXSI7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ZlcnNpb24nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBkYXRhYmFzZSB2ZXJzaW9uLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9VVEY4U3VwcG9ydENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1dGYtOCBzdXBwb3J0IGNoZWNrCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Q2hhcnNldCcpICF+IC91dGYoXC04fDgpL2kgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdEYXRhYmFzZSAodXRmOCknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBkYXRhYmFzZSB1dGY4IHN1cHBvcnQuJywKICAgICAgICBDb21tZW50ICAgICA9PiAnTm8gdmVyc2lvbiBmb3VuZCEnLAogICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgfTsKCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBuZXh0IHJvdyBpZiBub3QgdmVyc2lvbgogICAgICAgIG5leHQgaWYgJFJvd1swXSAhfiAvXnZlcnNpb24kL2k7CgogICAgICAgICMgZmluZCB0aGUgdmVyc2lvbiBudW1iZXIKICAgICAgICBpZiAoICRSb3dbMV0gPX4gL14oNFwuKDF8MnwzfDR8NSl8NVwufDZcLnw3XC4pLyApIHsKICAgICAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICdTdXBwb3J0ZWQuJzsKICAgICAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdPSyc7CgogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJ1dGY4IG5vdCBzdXBwb3J0ZWQgKE15U1FMICRSb3dbMV0pIjsKICAgIH0KCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVVRGOENsaWVudENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyBjaGFyYWN0ZXJfc2V0X2NsaWVudCBmb3VuZCEnOwogICAgIyB1dGYtOCBjbGllbnQgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgIX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHZhcmlhYmxlcycgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICNuZXh0IGlmIHJvdyBub3QgY2hhcmFjdGVyX3NldF9jbGllbnQKICAgICAgICBuZXh0IGlmICRSb3dbMF0gIX4gL15jaGFyYWN0ZXJfc2V0X2NsaWVudC9pOwoKICAgICAgICBpZiAoICRSb3dbMV0gPX4gL3V0ZjgvICkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIklzICRSb3dbMV0uIjsKCiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgICRNZXNzYWdlID0gImNoYXJhY3Rlcl9zZXRfY2xpZW50IGZvdW5kIGJ1dCBpdCdzIHNldCB0byAkUm93WzFdIChuZWVkIHRvIGJlIHV0ZjgpIjsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQ2xpZW50IENvbm5lY3Rpb24gKHV0ZjgpJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgdGhlIHV0ZjggY2xpZW50IGNvbm5lY3Rpb24uJywKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICB9OwoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9VVEY4RGF0YWJhc2VDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXRmLTggZGF0YWJhc2UgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgIX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gY2hhcmFjdGVyX3NldF9kYXRhYnNlIGZvdW5kISc7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHZhcmlhYmxlcycgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eY2hhcmFjdGVyX3NldF9kYXRhYmFzZS9pICkgewogICAgICAgICAgICAkTWVzc2FnZSA9ICJjaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIGZvdW5kIGJ1dCBpdCdzIHNldCB0byAkUm93WzFdIChuZWVkIHRvIGJlIHV0ZjgpIjsKICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC91dGY4LyApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIklzICRSb3dbMV0uIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnRGF0YWJhc2UgQ2hhcmFjdGVyICh1dGY4KScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIHRoZSB1dGY4IGRhdGFiYXNlIGNoYXJhY3Rlci4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVVRGOFRhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgIyB1dGYtOCB0YWJsZSBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIG15ICRDaGVjayAgICA9ICdGYWlsZWQnOwogICAgICAgIG15ICRNZXNzYWdlICA9ICcnOwogICAgICAgIG15ICRNZXNzYWdlMiA9ICcnOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdGFibGUgc3RhdHVzJyApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1sxNF0gIX4gL151dGY4L2kgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRNZXNzYWdlICkgewogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICcsICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiJFJvd1swXVxbJFJvd1sxNF1cXSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZTIgPSAkUm93WzE0XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiSW52YWxpZCBjb2xsYXRpb24gZm9yOiAkTWVzc2FnZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJE1lc3NhZ2UyOwogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENvbGxhdGlvbiAodXRmOCknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgdGhlIHV0ZjggdGFibGUgY29sbGF0aW9uL2NoYXJzZXQuJywKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICB9OwogICAgICAgIHJldHVybiAkRGF0YTsKICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9NYXhBbGxvd2VkUGFja2FnZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgbWF4X2FsbG93ZWRfcGFja2V0IGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gIm1heF9hbGxvd2VkX3BhY2tldCIgZm91bmQhJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15tYXhfYWxsb3dlZF9wYWNrZXQvaSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzFdIDwgMTAyNCAqIDEwMjQgKiA3ICkgewogICAgICAgICAgICAgICAgJFJvd1sxXSAgPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlwibWF4X2FsbG93ZWRfcGFja2V0XCIgc2hvdWxkIGJlIGhpZ2hlciB0aGUgNyBNQiAoaXQncyAkUm93WzFdIE1CKSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUm93WzFdICA9IGludCggJFJvd1sxXSAvIDEwMjQgLyAxMDI0ICk7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJJcyAkUm93WzFdIE1CLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnTWF4IFBhY2thZ2UgU2l6ZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrICJtYXhfYWxsb3dlZF9wYWNrZXQiIHNldHRpbmcuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1F1ZXJ5Q2FjaGVTaXplQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgIyBxdWVyeV9jYWNoZV9zaXplIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gInF1ZXJ5X2NhY2hlX3NpemUiIGZvdW5kISc7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHZhcmlhYmxlcycgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID1+IC9ecXVlcnlfY2FjaGVfc2l6ZS9pICkgewogICAgICAgICAgICBpZiAoICEkUm93WzFdICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICcicXVlcnlfY2FjaGVfc2l6ZSIgc2hvdWxkIGJlIHVzZWQsIHlvdSB3aWxsIGdldCBpbXByb3ZlbWVudHMgYmV0d2VlbiAxMCBhbmQgMzAgJSBvZiBzcGVlZCEnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFJvd1sxXSA8IDEwMjQgKiAxMDI0ICogMTAgKSB7CiAgICAgICAgICAgICAgICAkUm93WzFdICA9IGludCggJFJvd1sxXSAvIDEwMjQgLyAxMDI0ICk7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJcInF1ZXJ5X2NhY2hlX3NpemVcIiBzaG91bGQgYmUgaGlnaGVyIHRoZW4gMTAgTUIgKGl0J3MgJFJvd1sxXSBNQikiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJvd1sxXSAgPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1sxXSBNQiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnUXVlcnkgQ2FjaGUgU2l6ZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrICJxdWVyeV9jYWNoZV9zaXplIiBzZXR0aW5nLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwnOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICRGaWxlICkgKSB7CiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goIFN0cmluZyA9PiAkQ29udGVudCApOwoKICAgICAgICAgICAgbXkgQFByb2JsZW1zOwogICAgICAgICAgICBmb3IgbXkgJFRhYmxlICggQHsgJFhNTEhhc2hbMV0tPntkYXRhYmFzZX0tPlsxXS0+e1RhYmxlfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAnQ0hFQ0sgVEFCTEUnLXN0YXRlbWVudCB0byBkZXRlcm1pbmUgc3RhdGUgb2YgZWFjaCB0YWJsZQogICAgICAgICAgICAgICAgICAgICMgKHdoaWNoIG1heSB5aWVsZCBzZXZlcmFsIGxpbmVzIHBlciB0YWJsZSwgdGhlIGxhc3Qgb2Ygd2hpY2ggd2lsbAogICAgICAgICAgICAgICAgICAgICMgY29udGFpbiB0aGUgb3ZlcmFsbCBzdGF0ZSBvZiB0aGF0IHRhYmxlKQogICAgICAgICAgICAgICAgICAgICMgRG8gcXVpY2sgY2hlY2tzIG9uIHRhYmxlcywgb3RoZXIgd2F5IGl0IHRhZ3Mgb3ZlciA0MjAgc2VrCiAgICAgICAgICAgICAgICAgICAgIyBvciBsb25nZXIgdG8gY2hlY2sgaXQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICJDSEVDSyBUQUJMRSAkVGFibGUtPntOYW1lfSBGQVNUIFFVSUNLIiApICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0YXR1cyA9ICRSb3dbM107ICMgbG9vayBhdCBmaWVsZCAnTXNnX3RleHQnCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiAkU3RhdHVzID1+IC9eKE9LfFRhYmxlXHNpc1xzYWxyZWFkeVxzdXBcc3RvXHNkYXRlKS9pOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBQcm9ibGVtcywgIiRUYWJsZS0+e05hbWV9XFskU3RhdHVzXF0iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAUHJvYmxlbXMsICIkVGFibGUtPntOYW1lfVxbdW5hYmxlIHRvIGNoZWNrIHRhYmxlXF0iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQFByb2JsZW1zKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9IGpvaW4gIlxuIiwgQFByb2JsZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50IFRhYmxlcyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENoZWNrJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IGZpbmQgZmlsZSAkRmlsZSEiLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBXZWJzZXJ2ZXIucG0sdiAxLjcgMjAwOC8wNy8xMyAyMzoyNTo0MSBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXIgLSBnbG9iYWwgc3lzdGVtIGluZm9ybWF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24gdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIFdlYnNlcnZlciBpbmZvIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKICAgICRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggQWRtaW5DaGVja3MgaW5mb3JtYXRpb24uCgokV2Vic2VydmVyQXJyYXkgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwoKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGFBcnJheSA9IFtdOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIFdlYnNlcnZlcnMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKICAgICMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKCk7CiAgICAjICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdXNlZCBXZWJzZXJ2ZXIKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHRyeSB0byBmaW5kIG91dCB3aGljaCBXZWJzZXJ2ZXIgaXMgY29uZmlndXJlZAogICAgbXkgJFdlYnNlc