Support
1.5.6
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
- Tidied.
- Updated copyright.
Fixed regex for perl 5.22 and later.
Small fixes.
Fixed icons.
Code cleanup.
Ported to OTRS 3.3.
Verifies System settings and gives performance tips.
Das Support-Assessment-Modul prüft fehlerhafte System-Einstellungen und gibt Performance-Tips.
Comprueba configuraciones del sistema y brinda consejos de rendimiento.
3.3.x
The Support assessment module provides system checks and can help to find setup errors. After installation it can be accessed from the Administration Interface, in the System Administration panel.
Das Support-Assessment-Modul bietet Systemüberprüfungen an, mit denen Einrichtungsfehler erkannt werden können. Nach der Installation kann es über den Administrationsbereich im Abschnitt System-Administration aufgerufen werden.
El módulo de evaluación de soporte proporciona comprobaciones del sistema y puede ayudar a encontrar errores de configuración. Después de la instalación se puede acceder desde la Interfaz de Administración, en el panel de administración del sistema.
2018-07-24 11:36:10
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluU3VwcG9ydCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5TeXN0ZW1TdGF0dXMgb2JqZWN0IGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxUaXRsZT5TdXBwb3J0IEluZm88L1RpdGxlPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFkbWluLVN1cHBvcnQgT3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlN1cHBvcnQgQXNzZXNzbWVudDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+U3lzdGVtPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4yMDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+U3VwcG9ydC5EZWZhdWx0LmNzczwvQ1NTPgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6U2VuZGVyRW1haWwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhlIHVzZWQgc2VuZGVyIG1haWwgYWRkcmVzcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6Ok1TU1FMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIE1TU1FMIGRhdGFiYXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1cnJlbnRUaW1lc3RhbXBDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVmVyc2lvbkNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEYXRhYmFzZVNpemVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGF0YWJhc2VIb3N0bmFtZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6Ok15U1FMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIE15U1FMIGRhdGFiYXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1heEFsbG93ZWRQYWNrYWdlQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlF1ZXJ5Q2FjaGVTaXplQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVURjhDbGllbnRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVVRGOERhdGFiYXNlQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVURjhUYWJsZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdG9yYWdlRW5naW5lQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhYmxlc1dpdGhEaWZmZXJlbnRTdG9yYWdlRW5naW5lQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1cnJlbnRUaW1lc3RhbXBDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVmVyc2lvbkNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEYXRhYmFzZVNpemVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cHBvcnQ6OkRhdGFiYXNlOjpPcmFjbGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgT3JhY2xlIGRhdGFiYXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5MU0RhdGVGb3JtYXRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT3JhY2xlSG9tZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOTFNMYW5nQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5MU0RhdGVGb3JtYXRTZWxlY3RDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6OlBvc3RncmVTUUwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgUG9zdGdyZVNRTCBkYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEYXRlU3R5bGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVVRGOFNlcnZlckNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4Q2xpZW50Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1cnJlbnRUaW1lc3RhbXBDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVmVyc2lvbkNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEYXRhYmFzZVNpemVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cHBvcnQ6Ok9TIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluaXRpb24gb2YgdGhlIE9wZXJhdGluZyBTeXN0ZW0gY2hlY2tzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNQVUxvYWRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGlza1VzYWdlQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1lbW9yeVN3YXBDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGlzdHJpYnV0aW9uQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Iktlcm5lbEluZm9DaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGVybENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQZXJsTW9kdWxlc0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6T1RSUyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbml0aW9uIG9mIHRoZSBPVFJTIGNoZWNrcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPcGVuVGlja2V0Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpY2tldEluZGV4TW9kdWxlQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpY2tldFN0YXRpY0RCT3JwaGFuZWRSZWNvcmRzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaWNrZXRGdWxsdGV4dEluZGV4TW9kdWxlQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZRRE5Db25maWdDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU3lzdGVtSURDb25maWdDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTG9nQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZpbGVTeXN0ZW1DaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGFja2FnZURlcGxveUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbnZhbGlkVXNlckxvY2tlZFRpY2tldFNlYXJjaCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ29uZmlnQ2hlY2tUaWNrZXRGcm9udGVuZFJlc3BvbnNlRm9ybWF0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0VXNlckNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0U09BUFVzZXJDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR2VuZXJhbFN5c3RlbU92ZXJ2aWV3Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6V2Vic2VydmVyOjpBcGFjaGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5pdGlvbiBvZiB0aGUgd2Vic2VydmVyIGNoZWNrcyBmb3IgdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBhY2hlVmVyc2lvbkNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcGFjaGVFbnZpcm9ubWVudENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDR0lBY2NlbGVyYXRvckNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcGFjaGVEQklDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBhY2hlUmVsb2FkQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFwYWNoZU1vZERlZmxhdGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBhY2hlTW9kSGVhZGVyc0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6V2Vic2VydmVyOjpJSVMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5pdGlvbiBvZiB0aGUgd2Vic2VydmVyIGNoZWNrcyBmb3IgdGhlIElJUyB3ZWJzZXJ2ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSUlTVmVyc2lvbkNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQZXJsRXhDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSUlTRW52aXJvbm1lbnRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cHBvcnQ6OkNyb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5pdGlvbiBvZiB0aGUgQ3JvbiBjaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfU3VwcG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5TdXBwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdXBwb3J0IEFzc2Vzc21lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgc3VwcG9ydCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTUUwgYmVuY2htYXJrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZvciBxdWljayBoZWxwIHBsZWFzZSBzdWJtaXQgeW91ciBzeXN0ZW0gaW5mb3JtYXRpb24gYW5kIGNyZWF0ZSBhIHN1cHBvcnQgdGlja2V0IGF0IHRoZSB2ZW5kb3JcJ3Mgc2l0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3IgbW9yZSBpbmZvIHBsZWFzZSBjaGVjayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBTdXBwb3J0IEluZm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4tU3VwcG9ydCBPdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlkZW50aWFsIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ZlbmRvciBTdXBwb3J0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0J1Z3ppbGxhIElEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIHlvdVwndmUgYWxyZWFkeSBhZGRlZCBhIEJ1Z3ppbGxhIHJlcG9ydCBhdCBidWdzLm90cnMub3JnLCBwbGVhc2UgYWRkIHlvdXIgQnVnemlsbGEgSUQgaGVyZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIENvbnRyYWN0J30gPSAnV2FydHVuZ3N2ZXJ0cmFnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSByZWNvbW1lbmQgbWUgYSBTZXJ2aWNlIENvbnRyYWN0IHRvIG9wdGltaXplIG15IE9UUlMnfSA9CiAgICAgICAgJ0JpdHRlIGVtcGZlaGxlbiBTaWUgbWlyIGVpbmVuIFNlcnZpY2V2ZXJ0cmFnIHp1ciBPcHRpbWllcnVuZyBtZWluZXMgT1RSUyBTeXN0ZW1zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBjcmVhdGUgc3VwcG9ydCBwYWNrYWdlLCBiZWNhdXNlIHlvdSB3b3JrIGN1cnJlbnRseSB3aXRoIHRoZSBzeXN0ZW0gdXNlciByb290QGxvY2FsaG9zdCBhbmQgeW91ciBhZG1pbiBlbWFpbCBhZGRyZXNzIGlzIG5vdCB5ZXQgY29uZmlndXJlZC4gUGxlYXNlIGRlZmluZSB0aGUgYWRtaW4gZW1haWwgc2V0dGluZyBpbiB0aGUgU3lzQ29uZmlnIG1vZHVsZSBhbmQgZG9uXCd0IHVzZSB0aGUgdXNlciByb290QGxvY2FsaG9zdCBmb3Igd29ya2luZyB3aXRoIE9UUlMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbmZpcm0gdGhlIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiB0byBjb250aW51ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9va3MgZmluZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdWxkIG5vdCB0YWtlIG1vcmUgdGhhbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydvbiBhbiBhdmVyYWdlIHN5c3RlbSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCZW5jaG1hcmsnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhlY3V0ZSBhIFNRTCBiZW5jaG1hcmsgdGVzdCBvbiB5b3VyIGRhdGFiYXNlIHRvIGZpbmQgb3V0IGhvdyBmYXN0IHlvdXIgZGF0YWJhc2UgaXMgKGRvbmUgb24gZGVkaWNhdGVkIGJlbmNobWFyayB0YWJsZSkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBzaG91bGQgbm90IGJlIGRvbmUgb24gcHJvZHVjdGlvbiBzeXN0ZW1zISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNdWx0aXBsaWVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSBtdWx0aXBsaWVyIGFuZCBwcmVzcyBzdGFydCBidXR0b24uJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pblN1cHBvcnRMaWNlbnNlVGV4dAoKICAgICMgU3lzQ29uZmlnCgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIHVzZWQgc2VuZGVyIG1haWwgYWRkcmVzcy4nfSA9ICdEaWUgdmVyd2VuZGV0ZSBBYnNlbmRlcmFkcmVzc2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24gb2YgdGhlIENyb24gY2hlY2tzLid9ID0gJ0RlZmluaXRpb24gZGVyIENyb24tQ2hlY2tzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uIG9mIHRoZSBPVFJTIGNoZWNrcy4nfSA9ICdEZWZpbml0aW9uIGRlciBPVFJTLUNoZWNrcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbiBvZiB0aGUgT3BlcmF0aW5nIFN5c3RlbSBjaGVja3MuJ30gPSAnRGVmaW5pdGlvbiBkZXIgQmV0cmllYnNzeXN0ZW0tQ2hlY2tzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uIG9mIHRoZSBkYXRhYmFzZSBjaGVja3MgZm9yIHRoZSBNU1NRTCBkYXRhYmFzZS4nfSA9ICdEZWZpbml0aW9uIGRlciBEYXRlbmJhbmstQ2hlY2tzIGbDvHIgZGllIE1TU1FMIERhdGVuYmFuay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgTXlTUUwgZGF0YWJhc2UuJ30gPSAnRGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBmw7xyIGRpZSBNeVNRTCBEYXRlbmJhbmsuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIE9yYWNsZSBkYXRhYmFzZS4nfSA9ICdEZWZpbml0aW9uIGRlciBEYXRlbmJhbmstQ2hlY2tzIGbDvHIgZGllIE9yYWNsZSBEYXRlbmJhbmsuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIFBvc3RncmVTUUwgZGF0YWJhc2UuJ30gPSAnRGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBmw7xyIGRpZSBQb3N0Z3JlU1FMIERhdGVuYmFuay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbiBvZiB0aGUgd2Vic2VydmVyIGNoZWNrcyBmb3IgdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIuJ30gPSAnRGVmaW5pdGlvbiBkZXIgV2Vic2VydmVyLUNoZWNrcyBmw7xyIGRlbiBBcGFjaGUgV2Vic2VydmVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uIG9mIHRoZSB3ZWJzZXJ2ZXIgY2hlY2tzIGZvciB0aGUgSUlTIHdlYnNlcnZlci4nfSA9ICdEZWZpbml0aW9uIGRlciBXZWJzZXJ2ZXItQ2hlY2tzIGbDvHIgZGVuIElJUyBXZWJzZXJ2ZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pblN5c3RlbVN0YXR1cyBvYmplY3QgaW4gdGhlIGFkbWluIGFyZWEuJ30gPSAnRnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFkbWluU3lzdGVtU3RhdHVzLU9iamVrdHMgaW0gQWRtaW4tQmVyZWljaC4nOwoKICAgICMgRGF0YWJhc2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGFiYXNlJ30gPSAnJzsKCiAgICAjIG15c3FsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBNeVNRTCB2ZXJzaW9uIGZvdW5kLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNeVNRTCB2ZXJzaW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3lvdSBzaG91bGQgdXNlIDUuMCBvciBoaWdoZXIuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Vua25vd24gTXlTUUwgdmVyc2lvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRhYmFzZSBWZXJzaW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBkYXRhYmFzZSB2ZXJzaW9uLid9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0YWJhc2UgKHV0ZjgpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGRhdGFiYXNlIHV0Zjggc3VwcG9ydC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGF0YWJhc2UgdmVyc2lvbiBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciBkYXRhYmFzZSB2ZXJzaW9uIHN1cHBvcnRzIHV0ZjguJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3V0ZjggaXMgbm90IHN1cHBvcnRlZCd9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2hhcmFjdGVyX3NldF9jbGllbnQgc2V0dGluZyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciBjbGllbnQgY29ubmVjdGlvbiBpcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJGb3VuZCBjaGFyYWN0ZXJfc2V0X2NsaWVudCwgYnV0IGl0J3Mgc2V0IHRvIn0gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J25lZWRzIHRvIGJlIHV0ZjgnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IENvbm5lY3Rpb24gKHV0ZjgpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGlmIHRoZSBjbGllbnQgdXNlcyB1dGY4IGZvciB0aGUgY29ubmVjdGlvbi4nfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNoYXJhY3Rlcl9zZXRfZGF0YWJhc2Ugc2V0dGluZyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiQ2hhcmFjdGVyX3NldF9kYXRhYmFzZSBzZXR0aW5nIGZvdW5kLCBidXQgaXQncyBzZXQgdG8ifSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbmVlZHMgdG8gYmUgdXRmOCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3VyIGRhdGFiYXNlIGNoYXJzZXQgc2V0dGluZyBpcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRhYmFzZSBDaGFyc2V0ICh1dGY4KSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiB0aGUgZGF0YWJhc2UgdXNlcyB1dGY4IGFzIGNoYXJzZXQuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNoYXJzZXQgY29sbGF0aW9uIGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJsZSBDb2xsYXRpb24gKHV0ZjgpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIHRoZSB1dGY4IHRhYmxlIGNoYXJzZXQgY29sbGF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3VyIGNoYXJzZXQgY29sbGF0aW9uIGlzIHNldCB0byd9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gIm1heF9hbGxvd2VkX3BhY2tldCIgY29uZmlndXJhdGlvbiBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsic2hvdWxkIGJlIGhpZ2hlciB0aGFuIDIwIE1CIChpdCdzIn0gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heCBQYWNrYWdlIFNpemUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgIm1heF9hbGxvd2VkX3BhY2tldCIgc2V0dGluZy4nfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICJxdWVyeV9jYWNoZV9zaXplIiBzZXR0aW5nIGZvdW5kLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgc2V0dGluZyAicXVlcnlfY2FjaGVfc2l6ZSIgc2hvdWxkIGJlIHVzZWQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57IlRoZSBzZXR0aW5nICdxdWVyeV9jYWNoZV9zaXplJyBzaG91bGQgYmUgaGlnaGVyIHRoYW4gMTAgTUIgKGl0J3MifSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVlcnkgQ2FjaGUgU2l6ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayAicXVlcnlfY2FjaGVfc2l6ZSIgc2V0dGluZy4nfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGltZSBhbmQgZGF0YWJhc2Ugc2VydmVyIHRpbWUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIGlzIGEgbWF0ZXJpYWwgZGlmZmVyZW5jZSAoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBzZWNvbmRzKSBiZXR3ZWVuIGFwcGxpY2F0aW9uIHNlcnZlciAoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JykgYW5kIGRhdGFiYXNlIHNlcnZlciAoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JykgdGltZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBUaW1lc3RhbXAgQ2hlY2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgIlN5c3RlbSBUaW1lIiB2cyAiQ3VycmVudCBUaW1lc3RhbXAiLid9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW5hYmxlIHRvIGNoZWNrIHRhYmxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3RhYmxlcyBjaGVja2VkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJsZSBDaGVjayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJDYW4ndCBvcGVuIGZpbGUifSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiQ2FuJ3QgZmluZCBmaWxlIn0gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgZGV0ZXJtaW5lIGRhdGFiYXNlIHNpemUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGFiYXNlIHNpemUgaXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGRldGVybWluZSBkYXRhYmFzZSBuYW1lLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRhYmFzZSBTaXplJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NpemUgb2YgdGhlIGN1cnJlbnQgZGF0YWJhc2UuJ30gPSAnJzsKCiAgICAjIFBvc3RncmVzcWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J25vbmV4aXN0aW5nIHRhYmxlKHMpJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmtub3duIERhdGVTdHlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyduZWVkIElTTy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZVN0eWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIERhdGVTdHlsZS4nfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHNlcnZlcl9lbmNvZGluZyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiU2V0dGluZyBzZXJ2ZXJfZW5jb2RpbmcgZm91bmQsIGJ1dCBpdCdzIHNldCB0byJ9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycobmVlZCB0byBiZSBVTklDT0RFIG9yIFVURjgpLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQ29ubmVjdGlvbiAodXRmOCknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgdGhlIHV0Zjggc2VydmVyIGNvbm5lY3Rpb24uJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjbGllbnRfZW5jb2RpbmcgZm91bmQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57IlNldHRpbmcgY2xpZW50X2VuY29kaW5nIGZvdW5kLCBidXQgaXQncyBzZXQgdG8ifSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IENvbm5lY3Rpb24gKHV0ZjgpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIHRoZSB1dGY4IGNsaWVudCBjb25uZWN0aW9uLid9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gUG9zdGdyZVNRTCB2ZXJzaW9uIGZvdW5kLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgdXNlIFBvc3RncmVTUUwgdmVyc2lvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd5b3Ugc2hvdWxkIHVzZSA4Lnggb3IgaGlnbmVyLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmtub3duIFBvc3RncmVTUUwgdmVyc2lvbid9ID0gJyc7CgogICAgIyBNU1NRTAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGRldGVybWluZSBNaWNyb3NvZnQgU1FMIFNlcnZlciB2ZXJzaW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydsYXJnZSwgb2Ygd2hpY2gnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgYXZhaWxhYmxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaXplJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGRhdGFiYXNlIHNpemUuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgZGV0ZXJtaW5lIGRhdGFiYXNlIGhvc3RuYW1lLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRhYmFzZUhvc3QnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSG9zdG5hbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZGF0YWJhc2UgaG9zdG5hbWUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57IlRhYmxlIGRvZXNuJ3QgZXhpc3QifSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndGFibGVzJ30gPSAnJzsKCiAgICAjIE9yYWNsZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gT1JBQ0xFX0hPTUUgc2V0dGluZyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiT1JBQ0xFX0hPTUUgZG9uJ3QgZXhpc3RzIn0gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgT1JBQ0xFX0hvbWUgY29uZmlndXJhdGlvbiBpcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPUkFDTEVfSE9NRSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBPUkFDTEVfSE9NRSBjb25maWd1cmF0aW9uLid9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gTkxTX0xBTkcgY29uZmlndXJhdGlvbiBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbmVlZCAudXRmOCBpbiBOTFNfTEFORyAoZS4gZy4gZ2VybWFuX2dlcm1hbnkudXRmOCkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgTkxTX0xBTkcgY29uZmlndXJhdGlvbiBpcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBOTFNfTEFORy4nfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIE5MU19EQVRFX0ZPUk1BVCBzZXR0aW5nIGZvdW5kLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJOZWVkIGZvcm1hdCAnWVlZWS1NTS1ERCBISDI0Ok1JOlNTJyBmb3IgTkxTX0RBVEVfRk9STUFUIChub3QifSA9ICJFcyBuZWNlc2FyaW8gZWwgZm9ybWF0byAnWVlZWS1NTS1ERCBISDI0Ok1JOlNTJyBwYXJhIE5MU19EQVRFX0ZPUk1BVCAobm8iOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciBOTFNfREFURV9GT1JNQVQgc2V0dGluZyBpcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBOTFNfREFURV9GT1JNQVQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05MU19EQVRFX0ZPUk1BVCBzZWVtcyB0byBiZSB3cm9uZyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJpcyBub3QgdGhlIHJpZ2h0IGZvcm1hdCAneXl5eS1tbS1kZCBoaDptbTo6c3MnIChwbGVhc2UgY2hlY2sifSA9ICJubyBlcyBlbCBmb3JtYXRvIGNvcnJlY3RvICd5eXl5LW1tLWRkIGhoOm1tOjpzcycgKHBvciBmYXZvciB2ZXJpZmlxdWUiOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTkxTX0RBVEVfRm9ybWF0IGhhcyB0aGUgcmlnaHQgZm9ybWF0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIE5MU19EQVRFX0ZPUk1BVCBieSB1c2luZyBTRUxFQ1Qgc3RhdGVtZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJUYWJsZSBkb24ndCBleGlzdHMifSA9ICcnOwoKICAgICMgd2Vic2VydmVyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWJzZXJ2ZXInfSA9ICcnOwoKICAgICMgYXBhY2hlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgYXJlIHJ1bm5pbmcnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGRldGVybWluZSBBcGFjaGUgdmVyc2lvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBhY2hlIFZlcnNpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzcGxheSB3ZWIgc2VydmVyIHZlcnNpb24uJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcGFjaGU6OkRCSSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYSBiZXR0ZXIgcGVyZm9ybWFuY2UgKHByZS1lc3RhYmxpc2ggZGF0YWJhc2UgY29ubmVjdGlvbnMpLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiB0aGUgc3lzdGVtIHVzZXMgQXBhY2hlOjpEQkkuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcGFjaGU6OlJlbG9hZCBvciBBcGFjaGUyOjpSZWxvYWQgc2hvdWxkIGJlIHVzZWQgYXMgUGVybE1vZHVsZSBhbmQgUGVybEluaXRIYW5kbGVyIHRvIHByZXZlbnQgd2ViIHNlcnZlciByZXN0YXJ0cyB3aGVuIGluc3RhbGxpbmcgYW5kIHVwZ3JhZGluZyBtb2R1bGVzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiB0aGUgc3lzdGVtIHVzZXMgQXBhY2hlOjpSZWxvYWQvQXBhY2hlMjo6UmVsb2FkLid9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHVzZSBhIGJldGEgdmVyc2lvbiBvZiBtb2RfcGVybCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gYSBzdGFibGUgdmVyc2lvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHNob3VsZCB1cGRhdGUgbW9kX3BlcmwgdG8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGFyZSB1c2luZyBGYXN0Q0dJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugc2hvdWxkIHVzZSBGYXN0Q0dJIG9yIG1vZF9wZXJsIHRvIGluY3JlYXNlIHlvdXIgcGVyZm9ybWFuY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NHSSBBY2NlbGVyYXRvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBmb3IgQ0dJIEFjY2VsZXJhdG9yLid9ID0gJyc7CgogICAgIyBJSVMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlcmxFeCBpcyBpbiB1c2UnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHNob3VsZCB1c2UgUGVybEV4IHRvIGluY3JlYXNlIHlvdXIgcGVyZm9ybWFuY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGlmIFBlcmxFeCBpcyB1c2VkLid9ID0gJyc7CgogICAgIyBvcwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1MnfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc3RyaWJ1dGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdXNlZCBkaXN0cmlidXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIHVzZWQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc3RyaWJ1dGlvbiB1bmtub3duLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgZGV0ZXJtaW5lIGRpc3RyaWJ1dGlvbi4nfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0tlcm5lbCBWZXJzaW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB1c2VkIEtlcm5lbCB2ZXJzaW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgZXhlY3V0ZSB1bmFtZSAtYS4uLid9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybENoZWNrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIFBlcmwgdmVyc2lvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciBQZXJsJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIHRvbyBvbGQsIHlvdSBzaG91bGQgdXBncmFkZSB0byBQZXJsIDUuOC44IG9yIGhpZ2hlci4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5hYmxlIHRvIHBhcnNlIHZlcnNpb24gc3RyaW5nJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJsTW9kdWxlc0NoZWNrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIFBlcmwgTW9kdWxlcyBpbnN0YWxsZWQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIGlzIGFuIGVycm9yIGluIHlvdXIgaW5zdGFsbGVkIHBlcmwgbW9kdWxlcyBjb25maWd1cmF0aW9uLiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBQZXJsIG1vZHVsZXMgbmVlZGVkIGFyZSBjdXJyZW50bHkgaW5zdGFsbGVkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmFibGUgdG8gY2hlY2sgUGVybCBtb2R1bGVzLid9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIEhvc3QgU3lzdGVtIGhhcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNQiBNZW1vcnkgdG90YWwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTUIgTWVtb3J5IGZyZWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTUIgU3dhcCB0b3RhbCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNQiBTd2FwIGZyZWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVtb3J5IFN3YXAgQ2hlY2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBNZW1vcnkgQ2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiBTd2FwRnJlZSA6IFN3YXBUb3RhbCA8IDYwICUgb3IgaWYgbW9yZSB0aGFuIDIwMCBNQiBTd2FwIGlzIHVzZWQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIFN3YXAgZW5hYmxlZCEnfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBIb3N0IFN5c3RlbSBoYXMgYSBsb2FkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2luIHRoZSBsYXN0IDEgbWludXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2luIHRoZSBsYXN0IDUgbWludXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbiB0aGUgbGFzdCAxNSBtaW51dGVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NQVSBMb2FkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiB0aGUgc3lzdGVtIGxvYWQgaW4gdGhlIGxhc3QgMTUgbWludXRlcyA+IDEuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiB0aGUgc3lzdGVtIGxvYWQgaW4gdGhlIGxhc3QgMTUgbWludXRlcyA+IDEuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNrIGlzIGZ1bGwnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzayB1c2FnZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBkaXNrIHVzYWdlLid9ID0gJyc7CgogICAgIyBPVFJTCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBtb3JlIGVycm9yIGxvZyBlbnRyaWVzOiAnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgaXMgb25lIGVycm9yIGxvZyBlbnRyeTogJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvZ0NoZWNrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGxvZyBmb3IgZXJyb3IgbG9nIGVudHJpZXMuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZC4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgYXJlIHVzaW5nJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57InRoYXQncyBmaW5lIGZvciJ9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd0aWNrZXRzIGluIHlvdXIgc3lzdGVtLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBUaWNrZXQ6OkluZGV4TW9kdWxlIHNldHRpbmcuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd0aWNrZXRzIGluIFN0YXRpY0RCIGxvY2tfaW5kZXggYnV0IHlvdSBhcmUgdXNpbmcgdGhlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2luZGV4LiBQbGVhc2UgcnVuIG90cnMvYmluL290cnMuQ2xlYW5UaWNrZXRJbmRleC5wbCB0byBjbGVhbiB0aGUgU3RhdGljREIgaW5kZXguJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3RpY2tldHMgaW4gU3RhdGljREIgaW5kZXggYnV0IHlvdSBhcmUgdXNpbmcgdGhlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwaW5nIHRlc3QuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9ycGhhbmVkIHJlY29yZHMgZm91bmQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldFN0YXRpY0RCT3JwaGFuZWRSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIG9ycGhhbmVkIFN0YXRpY0RCIHJlY29yZHMuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhcnRpY2xlcyBpbiB5b3VyIHN5c3RlbS4gWW91IHNob3VsZCB1c2UgdGhlIFN0YXRpY0RCIGJhY2tlbmQgZm9yIE9UUlMgMi4zIGFuZCBoaWdoZXIuIFNlZSBhZG1pbiBtYW51YWwgKFBlcmZvcm1hbmNlIFR1bmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPQogICAgICAgICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgZGlyZWN0b3J5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FydGljbGVzIGluIHlvdXIgc3lzdGVtLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlIHNldHRpbmcuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbiA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlIG92ZXIgODk5OTkhIEluIGNhc2UgeW91IHdhbnQgdG8gaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlLCBjbG9zZSBub3QgbmVlZGVkIG9wZW4gdGlja2V0cy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugc2hvdWxkIG5vdCBoYXZlIG92ZXIgODAwMCBvcGVuIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uIFlvdSBjdXJyZW50bHkgaGF2ZSAnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW4gY2FzZSB5b3Ugd2FudCB0byBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UsIGNsb3NlIG5vdCBuZWVkZWQgb3BlbiB0aWNrZXRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbiA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlICd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSAnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlblRpY2tldENoZWNrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4nfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZRRE5Db25maWdDaGVjayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiB0aGUgY29uZmlndXJlZCBGUUROIGlzIHZhbGlkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY29uZmlndXJlIHlvdXIgRlFETiBpbnNpZGUgdGhlIFN5c0NvbmZpZyBtb2R1bGUuIChjdXJyZW50bHkgdGhlIGRlZmF1bHQgc2V0dGluZyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyBlbmFibGVkKS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBGUUROJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2xvb2tzIGdvb2QuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW1JRENvbmZpZ0NoZWNrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGlmIHRoZSBjb25maWd1cmVkIFN5c3RlbUlEIGNvbnRhaW5zIG9ubHkgZGlnaXRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3VyIFN5c3RlbUlEIHNldHRpbmcgaXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIFN5c3RlbUlEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J211c3QgY29uc2lzdCBvZiBkaWdpdHMgZXhjbHVzaXZlbHkuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNwb25zZUZvcm1hdENoZWNrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGlmIFRpY2tldDo6RnJvbnRlbmQ6OlJlc3BvbnNlRm9ybWF0IGNvbnRhaW5zIG5vICREYXRheyIifS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnd2FzIG5vdCBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIG9wdGlvbiBUaWNrZXQ6OkZyb250ZW5kOjpSZXNwb25zZUZvcm1hdCBjb2ludGFpbnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnc2hvdWxkIGJlIHVzZWQgaW5zdGFuZCAoc2VlIGRlZmF1bHQgc2V0dGluZykuJ30gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWxlU3lzdGVtQ2hlY2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgaWYgZmlsZSBzeXN0ZW0gaXMgd3JpdGFibGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBmaWxlIHN5c3RlbSBpcyB3cml0YWJsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCBob21lIGRpcmVjdG9yeSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJDYW4ndCB3cml0ZSBmaWxlIn0gPSAnJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYWNrYWdlRGVwbG95Q2hlY2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZGVwbG95bWVudCBvZiBhbGwgcGFja2FnZXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBwYWNrYWdlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFja2FnZXMgbm90IGNvcnJlY3RseSBpbnN0YWxsZWQnfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBmb3IgaW52YWxpZCB1c2VyIHdpdGggbG9ja2VkIHRpY2tldHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIGFyZSBubyBpbnZhbGlkIHVzZXJzIHdpdGggbG9ja2VkIHRpY2tldHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXNlIGludmFsaWQgdXNlcnMgaGF2ZSBsb2NrZWQgdGlja2V0cyd9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmYXVsdFVzZXJDaGVjayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiByb290QGxvY2FsaG9zdCBhY2NvdW50IGhhcyB0aGUgZGVmYXVsdCBwYXNzd29yZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgaXMgbm8gYWN0aXZlIHJvb3RAbG9jYWxob3N0IHdpdGggZGVmYXVsdCBwYXNzd29yZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiQ2hhbmdlIHRoZSBwYXNzd29yZCBvciBpbnZhbGlkYXRlIHRoZSBhY2NvdW50ICdyb290XEBsb2NhbGhvc3QnLiJ9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU09BUENoZWNrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGRlZmF1bHQgU09BUCBjcmVkZW50aWFscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm90IGVuYWJsZWQgU09BUCBvciBoYXZlIHNldCB5b3VyIG93biBwYXNzd29yZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCBhIHN0cm9uZyBwYXNzd29yZCBmb3IgU09BUDo6UGFzc3dvcmQgaW4gU3lzQ29uZmlnLid9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvZHVjdCd9ID0gJ1Byb2R1a3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0cyd9ID0gJ1RpY2tldHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJ0aWNsZXMnfSA9ICdBcnRpa2VsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50cyd9ID0gJ0FnZW50ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9sZXMnfSA9ICdSb2xsZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JvdXBzJ30gPSAnR3J1cHBlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcnRpY2xlcyBwZXIgdGlja2V0IChhdmcpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZXJhdGluZyBzeXN0ZW0nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhzIGJldHdlZW4gZmlyc3QgYW5kIGxhc3QgdGlja2V0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldHMgcGVyIG1vbnRoIChhdmcpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0F0dGFjaG1lbnRzIHBlciB0aWNrZXQgKGF2ZyknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXR0YWNobWVudCBzaXplIChhdmcpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWxTeXN0ZW1PdmVydmlldyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNwbGF5IGEgZ2VuZXJhbCBzeXN0ZW0gb3ZlcnZpZXcnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIHN5c3RlbS4nfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfTVhfU3VwcG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5TdXBwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdXBwb3J0IEFzc2Vzc21lbnQnfSA9ICdWYWxvcmFjaW9uZXMgZGUgc29wb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBzdXBwb3J0J30gPSAnQ29tZW56YXIgc29wb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTUUwgYmVuY2htYXJrJ30gPSAnQ29tcGFyYXRpdmEgU1FMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZvciBxdWljayBoZWxwIHBsZWFzZSBzdWJtaXQgeW91ciBzeXN0ZW0gaW5mb3JtYXRpb24gYW5kIGNyZWF0ZSBhIHN1cHBvcnQgdGlja2V0IGF0IHRoZSB2ZW5kb3JcJ3Mgc2l0ZS4nfSA9CiAgICAgICAgJ1BhcmEgYXl1ZGEgcsOhcGlkYSBwb3IgZmF2b3Igc3VtaW5pc3RyZSBzdSBpbmZvcm1hY2nDs24geSBjcmVlIHVuIHRpY2tldCBkZSBzb3BvcnRlIGVuIGVsIHNpdGlvIGRlbCBwcm92ZWVkb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9yIG1vcmUgaW5mbyBwbGVhc2UgY2hlY2snfSA9ICdQYXJhIG1hcyBpbmZvcm1hY2nDs24gcG9yIGZhdm9yIHZpc2l0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBTdXBwb3J0IEluZm8nfSA9ICdJbmZvcm1hY2nDs24gZGUgc29wb3J0ZSBwYXJhIGFkbWluaXN0cmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi1TdXBwb3J0IE92ZXJ2aWV3Lid9ID0gJ1Jlc3VtZW4gZGUgaW5mb3JtYWNpw7NuIGRlIHNvcG9ydGUgcGFyYSBhZG1pbmlzdHJhY2nDs24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZGVudGlhbCBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFjacOzbiBjb25maWRlbmNpYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmVuZG9yIFN1cHBvcnQnfSA9ICdTb3BvcnRlIGRlIHByb3ZlZWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCdWd6aWxsYSBJRCd9ID0gJ0lkZW50aWZpY2Fkb3IgQnVnemlsbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgeW91XCd2ZSBhbHJlYWR5IGFkZGVkIGEgQnVnemlsbGEgcmVwb3J0IGF0IGJ1Z3Mub3Rycy5vcmcsIHBsZWFzZSBhZGQgeW91ciBCdWd6aWxsYSBJRCBoZXJlLid9ID0KICAgICAgICAnU2kgeWEgaGEgYWdyZWdhZG8gdW4gcmVwb3J0ZSBkZSBlcnJvciBlbiBidWdzLm90cnMub3JnLCBwb3IgZmF2b3IgYWdyZWd1ZSBzdSBpZGVudGlmaWNhZG9yIGRlIEJ1Z3ppbGxhIGFxdWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgQ29udHJhY3QnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHJlY29tbWVuZCBtZSBhIFNlcnZpY2UgQ29udHJhY3QgdG8gb3B0aW1pemUgbXkgT1RSUyd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBjcmVhdGUgc3VwcG9ydCBwYWNrYWdlLCBiZWNhdXNlIHlvdSB3b3JrIGN1cnJlbnRseSB3aXRoIHRoZSBzeXN0ZW0gdXNlciByb290QGxvY2FsaG9zdCBhbmQgeW91ciBhZG1pbiBlbWFpbCBhZGRyZXNzIGlzIG5vdCB5ZXQgY29uZmlndXJlZC4gUGxlYXNlIGRlZmluZSB0aGUgYWRtaW4gZW1haWwgc2V0dGluZyBpbiB0aGUgU3lzQ29uZmlnIG1vZHVsZSBhbmQgZG9uXCd0IHVzZSB0aGUgdXNlciByb290QGxvY2FsaG9zdCBmb3Igd29ya2luZyB3aXRoIE9UUlMuJ30gPQogICAgICAgICdObyBlcyBwb3NpYmxlIGNyZWFyIHVuIHBhcXVldGUgZGUgc29wb3J0ZSwgZGViaWRvIGEgcXVlIHNlIGVuY3VlbnRyYSBhY3R1YWxtZW50ZSB1dGlsaXphbmRvIGVsIHVzdWFyaW8gZGUgc2lzdGVtYSByb290QGxvY2FsaG9zdCwgeSBzdSBjdWVudGEgZGUgY29ycmVvIGVsZWN0csOzbmljbyBwYXJhIGFkbWluaXN0cmFjacOzbiBubyBzZSBlbmN1ZW50cmEgY29uZmlndXJhZGEsIHBvciBmYXZvciBkZWZpbmEgbGFzIGNvbmZpZ3VyYWNpb25lcyBwZXJ0aW5lbnRlcyBwYXJhIGRpY2hvIGNvcnJlbyBlbGVjdHLDs25pY28gZW4gZWwgbW9kdWxvIGRlIENvbmZpZ3VyYWNpw7NuIGRlbCBzaXN0ZW1hIHkgbm8gdXRpbGl6ZSBlbCB1c3VhcmlvIHJvb3RAbG9jYWxob3N0IHBhcmEgdHJhYmFqYXIgY29uIE9UUlMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjb25maXJtIHRoZSBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gdG8gY29udGludWUuJ30gPSAnUG9yIGZhdm9yIGNvbmZpcm1lIHN1IGluZm9ybWFjacOzbiBjb25maWRlbmNpYWwgcGFyYSBjb250aW51YXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvb2tzIGZpbmUhJ30gPSAnU2UgdmUgYmllbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3VsZCBub3QgdGFrZSBtb3JlIHRoYW4nfSA9ICdObyBkZWJlcsOtYSB0YXJkYXIgbWFzIGRlICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydvbiBhbiBhdmVyYWdlIHN5c3RlbSd9ID0gJ2VuIHVuIHNpc3RlbWEgcHJvbWVkaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmVuY2htYXJrJ30gPSAnQ29tcGFyYXRpdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhlY3V0ZSBhIFNRTCBiZW5jaG1hcmsgdGVzdCBvbiB5b3VyIGRhdGFiYXNlIHRvIGZpbmQgb3V0IGhvdyBmYXN0IHlvdXIgZGF0YWJhc2UgaXMgKGRvbmUgb24gZGVkaWNhdGVkIGJlbmNobWFyayB0YWJsZSkuJ30gPQogICAgICAgICdFamVjdXRhIHVuYSBjb21wYXJhdGl2YSBTUUwgcGFyYSBjb25vY2VyIHF1ZSB0YW4gcsOhcGlkYSBlcyBzdSBiYXNlIGRlIGRhdG9zIChTZSByZWFsaXphIGVuIHVuYSB0YWJsYSBkZWRpY2FkYSBwYXJhIGRpY2hhIGNvbXBhcmF0aXZhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBzaG91bGQgbm90IGJlIGRvbmUgb24gcHJvZHVjdGlvbiBzeXN0ZW1zISd9ID0gJ05vIGRlYmVyw6Egc2VyIGVqZWN1dGFkYSBlbiB1biBzaXN0ZW1hIGVuIHByb2R1Y2Npw7NuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNdWx0aXBsaWVyJ30gPSAnTXVsdGlwbGljYWRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgbXVsdGlwbGllciBhbmQgcHJlc3Mgc3RhcnQgYnV0dG9uLid9ID0gJ1BvciBmYXZvciBzZWxlY2Npb25lIHVuIG11bHRpcGxpY2Fkb3IgeSBwcmVzaW9uZSBlbCBib3TDs24gZGUgaW5pY2lhci4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluU3VwcG9ydExpY2Vuc2VUZXh0CgogICAgIyBTeXNDb25maWcKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgdXNlZCBzZW5kZXIgbWFpbCBhZGRyZXNzLid9ID0gJ0RpcmVjY2nDs24gZGUgY29ycmVvIHBhcmEgZW52aWFyIHBhcXVldGVzIGRlIHNvcG9ydGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24gb2YgdGhlIENyb24gY2hlY2tzLid9ID0gJ0RlZmluaWNpw7NuIGRlIGxhcyB2ZXJpZmljYWNpb25lcyBwYXJhIENyb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbiBvZiB0aGUgT1RSUyBjaGVja3MuJ30gPSAnRGVmaW5pY2nDs24gZGUgbGFzIHZlcmlmaWNhY2lvbmVzIHBhcmEgT1RSUyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uIG9mIHRoZSBPcGVyYXRpbmcgU3lzdGVtIGNoZWNrcy4nfSA9ICdEZWZpbmljacOzbiBkZSBsYXMgdmVyaWZpY2FjaW9uZXMgcGFyYSBlbCBTaXN0ZW1hIE9wZXJhdGl2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbml0aW9uIG9mIHRoZSBkYXRhYmFzZSBjaGVja3MgZm9yIHRoZSBNU1NRTCBkYXRhYmFzZS4nfSA9ICdEZWZpbmljacOzbiBkZSBsYXMgdmVyaWZpY2FjaW9uZXMgcGFyYSBsYSBiYXNlIGRlIGRhdG9zIE1TU1FMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIE15U1FMIGRhdGFiYXNlLid9ID0gJ0RlZmluaWNpw7NuIGRlIGxhcyB2ZXJpZmljYWNpb25lcyBwYXJhIGxhIGJhc2UgZGUgZGF0b3MgTXlTUUwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgT3JhY2xlIGRhdGFiYXNlLid9ID0gJ0RlZmluaWNpw7NuIGRlIGxhcyB2ZXJpZmljYWNpb25lcyBwYXJhIGxhIGJhc2UgZGUgZGF0b3MgT3JhY2xlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIFBvc3RncmVTUUwgZGF0YWJhc2UuJ30gPSAnRGVmaW5pY2nDs24gZGUgbGFzIHZlcmlmaWNhY2lvbmVzIHBhcmEgbGEgYmFzZSBkZSBkYXRvcyBQb3N0Z3JlU1FMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluaXRpb24gb2YgdGhlIHdlYnNlcnZlciBjaGVja3MgZm9yIHRoZSBBcGFjaGUgd2Vic2VydmVyLid9ID0gJ0RlZmluaWNpw7NuIGRlIGxhcyB2ZXJpZmljYWNpb25lcyBwYXJhIGVsIHNlcnZpZG9yIHdlYiBBcGFjaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5pdGlvbiBvZiB0aGUgd2Vic2VydmVyIGNoZWNrcyBmb3IgdGhlIElJUyB3ZWJzZXJ2ZXIuJ30gPSAnRGVmaW5pY2nDs24gZGUgbGFzIHZlcmlmaWNhY2lvbmVzIHBhcmEgZWwgc2Vydmlkb3Igd2ViIElJUyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5TeXN0ZW1TdGF0dXMgb2JqZWN0IGluIHRoZSBhZG1pbiBhcmVhLid9ID0gJ1JlZ2lzdHJvIGVuIGVsIHNpc3RlbWEgZGVsIG1vZHVsbyBkZSBzb3BvcnRlLic7CgogICAgIyBEYXRhYmFzZQoKICAgICMgbXlzcWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGFiYXNlJ30gPSAnQmFzZSBkZSBkYXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBNeVNRTCB2ZXJzaW9uIGZvdW5kLid9ID0gJ05vIGZ1ZSBlbmNvbnRyYWRhIG5pbmd1bmEgdmVyc2nDs24gZGUgTXlTUUwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTXlTUUwgdmVyc2lvbid9ID0gJ1ZlcnNpw7NuIGRlIE15U1FMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3lvdSBzaG91bGQgdXNlIDUuMCBvciBoaWdoZXIuJ30gPSAnZGViZXLDrWEgZGUgdXNhciBsYSB2ZXJzacOzbiA1LjAgbyBzdXBlcmlvci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5rbm93biBNeVNRTCB2ZXJzaW9uJ30gPSAnVmVyc2nDs24gZGUgYmFzZSBkZSBkYXRvcyBNeVNRTCBkZXNjb25vY2lkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRhYmFzZSBWZXJzaW9uLid9ID0gJ1ZlcnNpw7NuIGRlIGJhc2UgZGUgZGF0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZGF0YWJhc2UgdmVyc2lvbi4nfSA9ICdWZXJpZmljYSBsYSB2ZXJzacOzbiBkZSBiYXNlIGRlIGRhdG9zJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRhYmFzZSAodXRmOCknfSA9ICdCYXNlIGRlIGRhdG9zICh1dGY4KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBkYXRhYmFzZSB1dGY4IHN1cHBvcnQuJ30gPSAnVmVyaWZpY2Egc29wb3J0ZSBwYXJhIHV0ZjggZW4gbGEgYmFzZSBkZSBkYXRvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZGF0YWJhc2UgdmVyc2lvbiBmb3VuZC4nfSA9ICdObyBmdWUgZW5jb250cmFkYSB2ZXJzacOzbiBwYXJhIGxhIGJhc2UgZGUgZGF0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciBkYXRhYmFzZSB2ZXJzaW9uIHN1cHBvcnRzIHV0ZjguJ30gPSAnTGEgdmVyc2nDs24gZGUgYmFzZSBkZSBkYXRvcyBzb3BvcnRhIHV0ZjgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndXRmOCBpcyBub3Qgc3VwcG9ydGVkJ30gPSAndXRmOCBubyBlcyBzb3BvcnRhZG8nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNoYXJhY3Rlcl9zZXRfY2xpZW50IHNldHRpbmcgZm91bmQuJ30gPSAnTm8gZnVlIGVuY29udHJhZGEgbGEgY29uZmlndXJhY2nDs24gY2hhcmFjdGVyX3NldF9jbGllbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciBjbGllbnQgY29ubmVjdGlvbiBpcyd9ID0gJ1R1IGNvbmV4aW9uIGRlIGNsaWVudGUgZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiRm91bmQgY2hhcmFjdGVyX3NldF9jbGllbnQsIGJ1dCBpdCdzIHNldCB0byJ9ID0gJ1NlIGVuY29udHLDsyBjaGFyYWN0ZXJfc2V0X2NsaWVudCwgcGVybyB0aWVuZSB1biB2YWxvciBkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyduZWVkcyB0byBiZSB1dGY4J30gPSAnbmVjZXNpdGEgc2VyIHV0ZjgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpZW50IENvbm5lY3Rpb24gKHV0ZjgpJ30gPSAnQ29uZXhpb24gZGUgY2xpZW50ZSAodXRmOCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgaWYgdGhlIGNsaWVudCB1c2VzIHV0ZjggZm9yIHRoZSBjb25uZWN0aW9uLid9ID0gJ1ZlcmlmaWNhIHNpIGVsIGNsaWVudGUgdXRpbGl6YSB1dGY4IHBhcmEgbGEgY29uZXhpw7NuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIHNldHRpbmcgZm91bmQuJ30gPSAnTm8gc2UgaGEgZW5jb250cmFkbyBsYSBjb25maWd1cmFjacOzbiAiY2hhcmFjdGVyX3NldF9kYXRhYmFzZSInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiQ2hhcmFjdGVyX3NldF9kYXRhYmFzZSBzZXR0aW5nIGZvdW5kLCBidXQgaXQncyBzZXQgdG8ifSA9ICdTZSBoYSBlbmNvbnRyYWRvIGxhIGNvbmZpZ3VyYWNpw7NuICJjaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIiwgcGVybyBjb24gdW4gdmFsb3IgZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbmVlZHMgdG8gYmUgdXRmOCd9ID0gJ25lY2VzaXRhIHNlciB1dGY4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgZGF0YWJhc2UgY2hhcnNldCBzZXR0aW5nIGlzJ30gPSAnTGEgY29uZmlndXJhY2nDs24gZGUganVlZ28gZGUgY2FyYWN0ZXJlcyBwYXJhIHR1IGJhc2UgZGUgZGF0b3MgZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0YWJhc2UgQ2hhcnNldCAodXRmOCknfSA9ICdKdWVnbyBkZSBjYXJhY3RlcmVzIGRlIGxhIGJhc2UgZGUgZGF0b3MgKHV0ZjgpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGlmIHRoZSBkYXRhYmFzZSB1c2VzIHV0ZjggYXMgY2hhcnNldC4nfSA9ICdWZXJpZmljYSBzaSBsYSBiYXNlIGRlIGRhdG9zIHV0aWxpemEgdXRmOCBjb21vIGp1ZWdvIGRlIGNhcmFjdGVyZXMuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNoYXJzZXQgY29sbGF0aW9uIGZvcid9ID0gJ0NvdGVqYWRvIGRlIGp1ZWdvIGRlIGNhcmFjdGVyZXMgaW52YWxpZG8gcGFyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJsZSBDb2xsYXRpb24gKHV0ZjgpJ30gPSAnQ290ZWphZG8gZGUgdGFibGEgKHV0ZjgpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIHRoZSB1dGY4IHRhYmxlIGNoYXJzZXQgY29sbGF0aW9uLid9ID0gJ1ZlcmlmaWNhIGVsIGNvdGVqYWRvIGRlIGp1ZWdvIGRlIGNhcmFjdGVyZXMgdXRmOCBkZSBsYXMgdGFibGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgY2hhcnNldCBjb2xsYXRpb24gaXMgc2V0IHRvJ30gPSAnRWwgY290ZWphZG8gZGUganVlZ28gZGUgY2FyYWN0ZXJlcyBzZSBlbmN1ZW50cmEgY29sb2NhZG8gYSc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gIm1heF9hbGxvd2VkX3BhY2tldCIgY29uZmlndXJhdGlvbiBmb3VuZC4nfSA9ICdObyBzZSBoYSBlbmNvbnRyYWRvIGxhIGNvbmZpZ3VyYWNpw7NuICJtYXhfYWxsb3dlZF9wYWNrZXQiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57InNob3VsZCBiZSBoaWdoZXIgdGhhbiAyMCBNQiAoaXQncyJ9ID0gJ0RlYmVyw61hIHNlciBtYXlvciBhIDIwIE1CIChlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3VyIGNvbmZpZ3VyYXRpb24gc2V0dGluZyBpcyd9ID0gJ0xhIG9wY2nDs24gZGUgY29uZmlndXJhY2nDs24gZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4IFBhY2thZ2UgU2l6ZSd9ID0gJ1RhbWHDsW8gbcOheGltbyBkZSBwYXF1ZXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrICJtYXhfYWxsb3dlZF9wYWNrZXQiIHNldHRpbmcuJ30gPSAnVmVyaWZpY2EgbGEgY29uZmlndXJhY2nDs24gIm1heF9hbGxvd2VkX3BhY2tldCInOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICJxdWVyeV9jYWNoZV9zaXplIiBzZXR0aW5nIGZvdW5kLid9ID0gJ05vIHNlIGhhIGVuY29udHJhZG8gbGEgY29uZmlndXJhY2nDs24gInF1ZXJ5X2NhY2hlX3NpemUiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgc2V0dGluZyAicXVlcnlfY2FjaGVfc2l6ZSIgc2hvdWxkIGJlIHVzZWQuJ30gPSAnTGEgY29uZmlndXJhY2nDs24gInF1ZXJ5X2NhY2hlX3NpemUiIGRlYmUgc2VyIHVzYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57IlRoZSBzZXR0aW5nICdxdWVyeV9jYWNoZV9zaXplJyBzaG91bGQgYmUgaGlnaGVyIHRoYW4gMTAgTUIgKGl0J3MifSA9ICdMYSBjb25maWd1cmFjacOzbiAicXVlcnlfY2FjaGVfc2l6ZSIgZGViZSBzZXIgbWF5b3IgYSAxMCBNQiAoZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVlcnkgQ2FjaGUgU2l6ZSd9ID0gJ3RhbWHDsW8gZGVsIGNhY2hlIHBhcmEgY29uc3VsdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgInF1ZXJ5X2NhY2hlX3NpemUiIHNldHRpbmcuJ30gPSAnVmVyaWZpY2EgbGEgY29uZmlndXJhY2nDs24gInF1ZXJ5X2NhY2hlX3NpemUiJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyIHRpbWUgYW5kIGRhdGFiYXNlIHNlcnZlciB0aW1lLid9ID0gJ05vIGV4aXN0ZSBkaWZlcmVuY2lhIGVudHJlIGVsIHRpZW1wbyBkZWwgc2Vydmlkb3IgeSBlbCBkZSBsYSBiYXNlIGRlIGRhdG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIGlzIGEgbWF0ZXJpYWwgZGlmZmVyZW5jZSAoJ30gPSAnRXhpc3RlIHVuYSBkaWZlcmVuY2lhIG5vdGFibGUgKCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgc2Vjb25kcykgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgKCd9ID0gJyBzZWd1bmRvcykgZW50cmUgZWwgc2Vydmlkb3IgZGUgYXBsaWNhY2nDs24gKCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycpIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgKCd9ID0gJykgeSBlbCBzZXJ2aWRvciBkZSBiYXNlIGRlIGRhdG9zICgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKSB0aW1lLid9ID0gJykgdGllbXBvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgVGltZXN0YW1wIENoZWNrJ30gPSAnVmVyaWZpY2FjacOzbiBkZSBsYSBtYXJjYSBkZSB0aWVtcG8gYWN0dWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrICJTeXN0ZW0gVGltZSIgdnMgIkN1cnJlbnQgVGltZXN0YW1wIi4nfSA9ICdWZXJpZmljYSBsYXMgdmFyaWFibGVzIGRlIHRpZW1wbyAiU3lzdGVtIFRpbWUiIGNvbnRyYSAiQ3VycmVudCBUaW1lc3RhbXAiLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW5hYmxlIHRvIGNoZWNrIHRhYmxlJ30gPSAnTm8gZXMgcG9zaWJsZSB2ZXJpZmljYXIgbGEgdGFibGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndGFibGVzIGNoZWNrZWQuJ30gPSAndGFibGFzIHZlcmlmaWNhZGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJsZSBDaGVjayd9ID0gJ1ZlcmlmaWNhY2nDs24gZGUgdGFibGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nfSA9ICdWZXJpZmljYSBsYXMgdGFibGFzIGV4aXN0ZW50ZXMgcGFyYSBlbCBzaXN0ZW1hIGJhc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiQ2FuJ3Qgb3BlbiBmaWxlIn0gPSAnTm8gc2UgcHVlZGUgYWJyaXIgZWwgYXJjaGl2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJDYW4ndCBmaW5kIGZpbGUifSA9ICdObyBzZSBwdWVkZSBlbmNvbnRyYXIgZWwgYXJjaGl2byc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGRldGVybWluZSBkYXRhYmFzZSBzaXplLid9ID0gJ05vIHNlIGhhIHBvZGlkbyBkZXRlcm1pbmFyIGVsIHRhbWHDsW8gZGUgbGEgYmFzZSBkZSBkYXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRhYmFzZSBzaXplIGlzJ30gPSAnRWwgdGFtYcOxbyBkZSBiYXNlIGRlIGRhdG9zIGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBkZXRlcm1pbmUgZGF0YWJhc2UgbmFtZS4nfSA9ICdObyBoYSBzaWRvIHBvc2libGUgZGV0ZXJtaW5hciBlbCBub21icmUgZGUgbGEgYmFzZSBkZSBkYXRvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0YWJhc2UgU2l6ZSd9ID0gJ1RhbWHDsW8gZGUgbGEgYmFzZSBkZSBkYXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaXplIG9mIHRoZSBjdXJyZW50IGRhdGFiYXNlLid9ID0gJ1RhbWHDsW8gYWN0dWFsIGRlIGxhIGJhc2UgZGUgZGF0b3MuJzsKCiAgICAjIFBvc3RncmVzcWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J25vbmV4aXN0aW5nIHRhYmxlKHMpJ30gPSAndGFibGEocykgaW5leGlzdGVudGUocyknOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Vua25vd24gRGF0ZVN0eWxlJ30gPSAnRXN0aWxvIGRlIGZlY2hhIGRlc2Nvbm9jaWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J25lZWQgSVNPLid9ID0gJ0lTTyBlcyBuZWNlc2FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZVN0eWxlJ30gPSAnRXN0aWxvIGRlIGZlY2hhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIERhdGVTdHlsZS4nfSA9ICdWZXJpZmljYSBlbCBlc3RpbG8gZGUgZmVjaGEnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHNlcnZlcl9lbmNvZGluZyBmb3VuZC4nfSA9ICdzZXJ2ZXJfZW5jb2Rpbmcgbm8gZnVlIGVuY29udHJhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57IlNldHRpbmcgc2VydmVyX2VuY29kaW5nIGZvdW5kLCBidXQgaXQncyBzZXQgdG8ifSA9ICdDb25maWd1cmFjacOzbiBzZXJ2ZXJfZW5jb2RpbmcsIHBlcm8gY29sb2NhZGEgY29uIHZhbG9yIGRlICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycobmVlZCB0byBiZSBVTklDT0RFIG9yIFVURjgpLid9ID0gJyhuZWNlc2l0YSBzZXIgVU5JQ09ERSBvIFVURjgpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2ZXIgQ29ubmVjdGlvbiAodXRmOCknfSA9ICdDb25leGlvbiBkZWwgc2Vydmlkb3IgKHV0ZjgpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIHRoZSB1dGY4IHNlcnZlciBjb25uZWN0aW9uLid9ID0gJ1ZlcmlmaWNhIGxhIGNvbmV4aW9uIHV0ZjggZGVsIHNlcnZpZG9yJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjbGllbnRfZW5jb2RpbmcgZm91bmQuJ30gPSAnTm8gc2UgZW5jb250cm8gY2xpZW50X2VuY29kaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57IlNldHRpbmcgY2xpZW50X2VuY29kaW5nIGZvdW5kLCBidXQgaXQncyBzZXQgdG8ifSA9ICdTZSBlbmNvbnRybyBjbGllbnRfZW5jb2RpbmcsIHBlcm8gY29uIHZhbG9yIGRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWVudCBDb25uZWN0aW9uICh1dGY4KSd9ID0gJ0NvbmV4acOzbiBkZWwgY2xpZW50ZSAodXRmOCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgdGhlIHV0ZjggY2xpZW50IGNvbm5lY3Rpb24uJ30gPSAnVmVyaWZpY2EgbGEgY29uZXhpb24gdXRmOCBkZWwgY2xpZW50ZS4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIFBvc3RncmVTUUwgdmVyc2lvbiBmb3VuZC4nfSA9ICdObyBzZSBlbmNvbnRybyB2ZXJzaW9uIGRlIFBvc3RncmVTUUwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHVzZSBQb3N0Z3JlU1FMIHZlcnNpb24nfSA9ICdTZSBlc3RhIHV0aWxpemFuZG8gUG9zdGdyZVNRTCB2ZXJzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3lvdSBzaG91bGQgdXNlIDgueCBvciBoaWduZXIuJ30gPSAnZGViZSB1c2FyIDgueCBvIHN1cGVyaW9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Vua25vd24gUG9zdGdyZVNRTCB2ZXJzaW9uJ30gPSAnVmVyc2nDs24gZGVzY29ub2NpZGEgZGUgUG9zdGdyZVNRTCc7CgogICAgIyBNU1NRTAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGRldGVybWluZSBNaWNyb3NvZnQgU1FMIFNlcnZlciB2ZXJzaW9uLid9ID0gJ05vIGhhIHNpZG8gcG9zaWJsZSBkZXRlcm1pbmFyIHVuYSB2ZXJzacOzbiBwYXJhIE1pY3Jvc29mdCBTUUwgU2VydmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzJ30gPSAnZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbGFyZ2UsIG9mIHdoaWNoJ30gPSAnZGUgdGFtYcOxbywgZGVsIGN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgYXZhaWxhYmxlLid9ID0gJ3NlIGVuY3VlbnRyYSBkaXNwb25pYmxlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaXplJ30gPSAnVGFtYcOxbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBkYXRhYmFzZSBzaXplLid9ID0gJ1ZlcmlmaWNhIGVsIHRhbWHDsW8gZGUgbGEgYmFzZSBkZSBkYXRvcy4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBkZXRlcm1pbmUgZGF0YWJhc2UgaG9zdG5hbWUuJ30gPSAnTm8gZnVlIHBvc2libGUgZGV0ZXJtaW5hciBub21icmUgZGVsIGFuZml0cmnDs24gcGFyYSBsYSBiYXNlIGRlIGRhdG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRhYmFzZUhvc3QnfSA9ICdBbmZpdHJpw7NuIHBhcmEgbGEgYmFzZSBkZSBkYXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIb3N0bmFtZSd9ID0gJ05vbWJyZSBkZWwgYW5maXRyacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBkYXRhYmFzZSBob3N0bmFtZS4nfSA9ICdWZXJpZmljYSBlbCBub21icmUgZGVsIGFuZml0cmnDs24gcGFyYSBsYSBiYXNlIGRlIGRhdG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57IlRhYmxlIGRvZXNuJ3QgZXhpc3QifSA9ICdObyBleGlzdGUgbGEgdGFibGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndGFibGVzJ30gPSAndGFibGFzJzsKCiAgICAjIE9yYWNsZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gT1JBQ0xFX0hPTUUgc2V0dGluZyBmb3VuZC4nfSA9ICdMYSBjb25maWd1cmFjacOzbiBPUkFDTEVfSE9NRSBubyBmdWUgZW5jb250cmFkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJPUkFDTEVfSE9NRSBkb24ndCBleGlzdHMifSA9ICdObyBleGlzdGUgT1JBQ0xFX0hPTUUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciBPUkFDTEVfSG9tZSBjb25maWd1cmF0aW9uIGlzJ30gPSAnTGEgY29uZmlndXJhY2nDs24gcGFyYSBPUkFDTEVfSE9NRSBlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPUkFDTEVfSE9NRSd9ID0gJ09SQUNMRV9IT01FJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIE9SQUNMRV9IT01FIGNvbmZpZ3VyYXRpb24uJ30gPSAnVmVyaWZpY2EgbGEgY29uZmlndXJhY2nDs24gcGFyYSBPUkFDTEVfSE9NRS4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIE5MU19MQU5HIGNvbmZpZ3VyYXRpb24gZm91bmQuJ30gPSAnTGEgY29uZmlndXJhY2nDs24gTkxTX0xBTkcgbm8gZnVlIGVuY29udHJhZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbmVlZCAudXRmOCBpbiBOTFNfTEFORyAoZS4gZy4gZ2VybWFuX2dlcm1hbnkudXRmOCkuJ30gPSAnbmVjZXNpdGEgLnV0ZjggZW4gTkxTX0xBTkcgKGVqLiBnZXJtYW5fZ2VybWFueS51dGY4KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciBOTFNfTEFORyBjb25maWd1cmF0aW9uIGlzJ30gPSAnTGEgY29uZmlndXJhY2nDs24gcGFyYSBOTFNfTEFORyBlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBOTFNfTEFORy4nfSA9ICdWZXJpZmljYSBOTFNfTEFORyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gTkxTX0RBVEVfRk9STUFUIHNldHRpbmcgZm91bmQuJ30gPSAnTGEgY29uZmlndXJhY2nDs24gTkxTX0RBVEVfRk9STUFUIG5vIGZ1ZSBlbmNvbnRyYWRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJOZWVkIGZvcm1hdCAnWVlZWS1NTS1ERCBISDI0Ok1JOlNTJyBmb3IgTkxTX0RBVEVfRk9STUFUIChub3QifSA9ICJFcyBuZWNlc2FyaW8gZWwgZm9ybWF0byAnWVlZWS1NTS1ERCBISDI0Ok1JOlNTJyBwYXJhIE5MU19EQVRFX0ZPUk1BVCAobm8iOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciBOTFNfREFURV9GT1JNQVQgc2V0dGluZyBpcyd9ID0gJ0xhIGNvbmZpZ3VyYWNpw7NuIHBhcmEgTkxTX0RBVEVfRk9STUFUIGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIE5MU19EQVRFX0ZPUk1BVC4nfSA9ICdWZXJpZmljYSBOTFNfREFURV9GT1JNQVQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTkxTX0RBVEVfRk9STUFUIHNlZW1zIHRvIGJlIHdyb25nJ30gPSAnRWwgdmFsb3IgcGFyYSBOTFNfREFURV9GT1JNQVQgcGFyZWNlIHNlciBpbmNvcnJlY3RvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57ImlzIG5vdCB0aGUgcmlnaHQgZm9ybWF0ICd5eXl5LW1tLWRkIGhoOm1tOjpzcycgKHBsZWFzZSBjaGVjayJ9ID0gIm5vIGVzIGVsIGZvcm1hdG8gY29ycmVjdG8gJ3l5eXktbW0tZGQgaGg6bW06OnNzJyAocG9yIGZhdm9yIHZlcmlmaXF1ZSI7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOTFNfREFURV9Gb3JtYXQgaGFzIHRoZSByaWdodCBmb3JtYXQnfSA9ICdOTFNfREFURV9Gb3JtYXQgdGllbmUgZWwgZm9ybWF0byBjb3JyZWN0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBOTFNfREFURV9GT1JNQVQgYnkgdXNpbmcgU0VMRUNUIHN0YXRlbWVudC4nfSA9ICdWZXJpZmljYSBOTFNfREFURV9Gb3JtYXQgbWVpZGFudGUgZWwgdXNvIGRlIHVuYSBjb25zdWx0YSBTRUxFQ1QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiVGFibGUgZG9uJ3QgZXhpc3RzIn0gPSAnTGEgdGFibGEgbm8gZXhpc3RlJzsKCiAgICAjIHdlYnNlcnZlcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vic2VydmVyJ30gPSAnU2Vydmlkb3Igd2ViJzsKCiAgICAjIGFwYWNoZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGFyZSBydW5uaW5nJ30gPSAnU2UgZW5jdWVudHJhIGVqZWN1dGFuZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGRldGVybWluZSBBcGFjaGUgdmVyc2lvbi4nfSA9ICdObyBoYSBzaWRvIHBvc2libGUgZGV0ZXJtaW5hciBsYSB2ZXJzacOzbiBkZSBBcGFjaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBhY2hlIFZlcnNpb24nfSA9ICdWZXJzacOzbiBkZSBBcGFjaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzcGxheSB3ZWIgc2VydmVyIHZlcnNpb24uJ30gPSAnTXVlc3RyYSBsYSB2ZXJzacOzbiBkZWwgc2Vydmlkb3Igd2ViJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcGFjaGU6OkRCSSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYSBiZXR0ZXIgcGVyZm9ybWFuY2UgKHByZS1lc3RhYmxpc2ggZGF0YWJhc2UgY29ubmVjdGlvbnMpLid9ID0gJ0FwYWNoZTo6REJJIGRlYmUgc2VyIHVzYWRvIHBhcmEgb2J0ZW5lciB1biBtZWpvciByZW5kaW1pZW50byAoY29uZXhpb25lcyBwcmUtZXN0YWJsZWNpZGFzIGEgYmFzZSBkZSBkYXRvcyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgaWYgdGhlIHN5c3RlbSB1c2VzIEFwYWNoZTo6REJJLid9ID0gJ1ZlcmlmaWNhIHNpIGVsIHNpc3RlbWEgdXRpbGl6YSBBcGFjaGU6OkRCSSc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBhY2hlOjpSZWxvYWQgb3IgQXBhY2hlMjo6UmVsb2FkIHNob3VsZCBiZSB1c2VkIGFzIFBlcmxNb2R1bGUgYW5kIFBlcmxJbml0SGFuZGxlciB0byBwcmV2ZW50IHdlYiBzZXJ2ZXIgcmVzdGFydHMgd2hlbiBpbnN0YWxsaW5nIGFuZCB1cGdyYWRpbmcgbW9kdWxlcy4nfSA9ICdBcGFjaGU6OlJlbG9hZCBvciBBcGFjaGUyOjpSZWxvYWQgZGViZW4gc2VyIHVzYWRvcyBjb21vIFBlcmxNb2R1bGUgeSBQZXJsSW5pdEhhbmRsZXIgcGFyYSBwcmV2ZW5pciBlbCByZWluaWNpbyBkZWwgc2Vydmlkb3IgYWwgbW9tZW50byBkZSBpbnN0YWxhciBvIGFjdHVhbGl6YXIgbW9kdWxvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiB0aGUgc3lzdGVtIHVzZXMgQXBhY2hlOjpSZWxvYWQvQXBhY2hlMjo6UmVsb2FkLid9ID0gJ1ZlcmlmaWNhIHNpIGVsIHNpc3RlbWEgdXRsaXphIEFwYWNoZTo6UmVsb2FkL0FwYWNoZTI6OlJlbG9hZC4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB1c2UgYSBiZXRhIHZlcnNpb24gb2YgbW9kX3BlcmwnfSA9ICdTZSBlbmN1ZW50cmEgdXRpbGl6YW5kbyB1bmEgdmVyc2lvbiBwcmVlbGltaW5hciBkZSBtb2RfcGVybCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gYSBzdGFibGUgdmVyc2lvbi4nfSA9ICdEZWJlIGFjdHVhbGl6YXIgYSB1bmEgdmVyc2nDs24gZXN0YWJsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugc2hvdWxkIHVwZGF0ZSBtb2RfcGVybCB0byd9ID0gJ0RlYmUgYWN0dWFsaXphciBtb2RfcGVybCBhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBhcmUgdXNpbmcgRmFzdENHSS4nfSA9ICdGYXN0Q0dJIHNlIGVzdMOhIHV0aWxpemFuZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHNob3VsZCB1c2UgRmFzdENHSSBvciBtb2RfcGVybCB0byBpbmNyZWFzZSB5b3VyIHBlcmZvcm1hbmNlLid9ID0gJ0RlYmUgdXNhciBGYXN0Q0dJIG8gbW9kX3BlcmwgcGFyYSBpbmNyZW1lbnRhciBlbCByZW5kaW1pZW50by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0dJIEFjY2VsZXJhdG9yJ30gPSAnQWNlbGVyYWRvciBDR0knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgZm9yIENHSSBBY2NlbGVyYXRvci4nfSA9ICdWZXJpZmljYSB1biBhY2VsZXJhZG9yIENHSSc7CgogICAgIyBJSVMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlcmxFeCBpcyBpbiB1c2UnfSA9ICdQZXJsRXggc2UgZW5jdWVudHJhIGVuIHVzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugc2hvdWxkIHVzZSBQZXJsRXggdG8gaW5jcmVhc2UgeW91ciBwZXJmb3JtYW5jZS4nfSA9ICdEZWJlIHVzYXIgUGVybEV4IHBhcmEgaW5jcmVtZW50YXIgZWwgZGVzZW1wZcOxbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiBQZXJsRXggaXMgdXNlZC4nfSA9ICdWZXJpZmljYSBzaSBQZXJsRXggZXN0YSBlbiB1c28nOwoKICAgICMgb3MKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09TJ30gPSAnU2lzdGVtYSBvcGVyYXRpdm8nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc3RyaWJ1dGlvbid9ID0gJ0Rpc3RyaWJ1Y2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLid9ID0gJ011ZXN0cmEgbGEgZGlzdHJpYnVjacOzbiB1c2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyB1c2VkLid9ID0gJ2VzdGEgZW4gdXNvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXN0cmlidXRpb24gdW5rbm93bi4nfSA9ICdEaXN0cmlidWNpw7NuIGRlc2Nvbm9jaWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBkZXRlcm1pbmUgZGlzdHJpYnV0aW9uLid9ID0gJ05vIGVzIHBvc2libGUgZGV0ZXJtaW5hciBsYSBkaXN0cmlidWNpw7NuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydLZXJuZWwgVmVyc2lvbid9ID0gJ1ZlcnNpw7NuIGRlIEtlcm5lbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdXNlZCBLZXJuZWwgdmVyc2lvbi4nfSA9ICdNdWVzdHJhIGxhIHZlcnNpw7NuIGRlbCBLZXJuZWwgZW4gdXNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBleGVjdXRlIHVuYW1lIC1hLi4uJ30gPSAnTm8gZXMgcG9zaWJsZSBlamVjdXRhciB1bmFtZSAtYS4uLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybENoZWNrJ30gPSAnVmVyaWZpY2FjacOzbiBQZXJsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIFBlcmwgdmVyc2lvbi4nfSA9ICdWZXJpZmljYSBsYSB2ZXJzacOzbiBkZSBQZXJsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgUGVybCd9ID0gJ0xhIHZlcnNpw7NuIGRlIFBlcmwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgdG9vIG9sZCwgeW91IHNob3VsZCB1cGdyYWRlIHRvIFBlcmwgNS44Ljggb3IgaGlnaGVyLid9ID0gJ2VzIG11eSBhbnRpZ8O8YSwgZGViZSBhY3R1YWxpemFyIGEgUGVybCA1LjguOCBvIHN1cGVyaW9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VuYWJsZSB0byBwYXJzZSB2ZXJzaW9uIHN0cmluZyd9ID0gJ05vIGVzIHBvc2libGUgYW5hbGl6YXIgbGEgY2FkZW5hIGRlIHZlcnNpw7NuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJsTW9kdWxlc0NoZWNrJ30gPSAnVmVyaWZpY2FjacOzbiBkZSBsb3MgbcOzZHVsb3MgUGVybCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBQZXJsIE1vZHVsZXMgaW5zdGFsbGVkLid9ID0gJ1ZlcmlmaWNhY2nDs24gbcOzZHVsb3MgUGVybCBpbnN0YWxhZG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSBpcyBhbiBlcnJvciBpbiB5b3VyIGluc3RhbGxlZCBwZXJsIG1vZHVsZXMgY29uZmlndXJhdGlvbi4gUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLid9ID0gJ0V4aXN0ZSB1biBlcnJvciBlbiBsYSBjb25maWd1cmFjacOzbiBkZSBsb3MgbcOzZHVsb3MgUGVybCBpbnN0YWxhZG9zLiBQb3IgZmF2b3IgY29udGFjdGUgYSBzdSBhZG1pbmlzdHJhZG9yLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgUGVybCBtb2R1bGVzIG5lZWRlZCBhcmUgY3VycmVudGx5IGluc3RhbGxlZC4nfSA9ICdUb2RvcyBsb3MgbW9kdWxvcyBQZXJsIG5lY2VzYXJpb3Mgc2UgZW5jdWVudHJhbiBpbnN0YWxhZG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmFibGUgdG8gY2hlY2sgUGVybCBtb2R1bGVzLid9ID0gJ05vIGVzIHBvc2libGUgdmVyaWZpY2FyIG1vZHVsb3MgUGVybCc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIEhvc3QgU3lzdGVtIGhhcyd9ID0gJ0VsIHNpc3RlbWEgYW5maXRyacOzbiB0aWVuZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNQiBNZW1vcnkgdG90YWwnfSA9ICdNQiBtZW1vcmlhIHRvdGFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01CIE1lbW9yeSBmcmVlJ30gPSAnTUIgbWVtb3JpYSBsaWJyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNQiBTd2FwIHRvdGFsJ30gPSAnTUIgc3dhcCB0b3RhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNQiBTd2FwIGZyZWUnfSA9ICdNQiBzd2FwIGxpYnJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01lbW9yeSBTd2FwIENoZWNrJ30gPSAnVmVyaWZpY2EgbGEgbWVtb3JpYSBkZSBpbnRlcmNhbWJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmIFN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSBvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4nfSA9ICdVbmEgdmVyaWZpY2FjacOzbiBkZSBtZW1vcmlhLiBTZSB0cmF0YSBkZSBlbmNvbnRyYXIgc2kgbGEgbWVtb3JpYSBkZSBpbnRlcmNhbWlibyBsaWJyZSBlcyBtZW5vciBhbCA2MCUgZGVsIHRvdGFsIG8gc2kgbWFzIGRlIDIwMCBNQiBkZSBtZW1vcmlhIGRlIGludGVyY2FtYmlvIGVzdGFuIGVuIHVzby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gU3dhcCBlbmFibGVkISd9ID0gJyFObyBoYXkgbWVtb3JpYSBkZSBpbnRlcmNhbWJpbyBoYWJpbGl0YWRhISc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIEhvc3QgU3lzdGVtIGhhcyBhIGxvYWQnfSA9ICdFbCBzaXN0ZW1hIGFuZml0cmnDs24gaGEgY2FyZ2Fkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbiB0aGUgbGFzdCAxIG1pbnV0ZSd9ID0gJ2VuIGVsIHVsdGltbyBtaW51dG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW4gdGhlIGxhc3QgNSBtaW51dGVzJ30gPSAnZW4gbG9zIMO6bHRpbW9zIDUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbiB0aGUgbGFzdCAxNSBtaW51dGVzJ30gPSAnZW4gbG9zIMO6bHRpbW9zIDE1IG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ1BVIExvYWQnfSA9ICdDYXJnYSBkZSBsYSBVQ1AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDUFUgbG9hZCBjaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmIHRoZSBzeXN0ZW0gbG9hZCBpbiB0aGUgbGFzdCAxNSBtaW51dGVzID4gMS4nfSA9ICdWZXJpZmljYWNpw7NuIGRlIGxhIGNhcmdhIGRlIFVDUC4gU2UgaW50ZW50YSB2ZXJpZmljYXIgc2kgZWwgc2lzdGVtYSBoYSBjYXJnYWRvIGVuIGxvcyB1bHRpbW9zIDE1IG1pbnV0b3MgbWFzIGRlIDEgdmV6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiB0aGUgc3lzdGVtIGxvYWQgaW4gdGhlIGxhc3QgMTUgbWludXRlcyA+IDEuJ30gPSAnVmVyaWZpY2FjacOzbiBkZSBsYSBjYXJnYSBkZSBVQ1AuIFNlIGludGVudGEgdmVyaWZpY2FyIHNpIGVsIHNpc3RlbWEgaGEgY2FyZ2FkbyBlbiBsb3MgdWx0aW1vcyAxNSBtaW51dG9zIG1lbm9zIGRlIDEgdmV6JzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNrIGlzIGZ1bGwnfSA9ICdEaXNjbyBsbGVubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNrIHVzYWdlJ30gPSAnVXNvIGRlIGRpc2NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGRpc2sgdXNhZ2UuJ30gPSAnVmVyaWZpY2EgdXNvIGRlIGRpc2NvJzsKCiAgICAjIE9UUlMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG1vcmUgZXJyb3IgbG9nIGVudHJpZXM6ICd9ID0gJ1NlIHRpZW5lbiBtYXMgZW50cmFkYXMgZGUgZXJyb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgaXMgb25lIGVycm9yIGxvZyBlbnRyeTogJ30gPSAnSGF5IHVuYSBlbnRyYWRhIGRlIGVycm9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvZ0NoZWNrJ30gPSAnVmVyaWZpY2FjacOzbiBkZSBiaXRhY29yYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBsb2cgZm9yIGVycm9yIGxvZyBlbnRyaWVzLid9ID0gJ1ZlcmlmaWNhIGxhIGJpdGFjb3JhIHBhcmEgZW50cmFkYXMgZGUgZXJyb3IuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZC4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9CiAgICAgICAgJ3RpY2tldCBlbiBlbCBzaXN0ZW1hLiBTZSBkZWJlIHVzYXIgZWwgbW9kdWxvIFN0YXRpY0RCLiBWZWEgZWwgbWFudWFsIGRlIGFkbWluaXN0cmFjacOzbiAoQWp1c3RlcyBkZSByZW5kaW1pZW50bykgcGFyYSBtYXMgaW5mb3JtYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBhcmUgdXNpbmcnfSA9ICdTZSBlc3RhIHVzYW5kbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJ0aGF0J3MgZmluZSBmb3IifSA9ICdlcyBjb3JyZWN0byBwYXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3RpY2tldHMgaW4geW91ciBzeXN0ZW0uJ30gPSAndGlja2V0cyBlbiBlbCBzaXN0ZW1hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIFRpY2tldDo6SW5kZXhNb2R1bGUgc2V0dGluZy4nfSA9ICdWZXJpZmljYSBsYSBjb25maWd1cmFjacOzbiBUaWNrZXQ6OkluZGV4TW9kdWxlLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndGlja2V0cyBpbiBTdGF0aWNEQiBsb2NrX2luZGV4IGJ1dCB5b3UgYXJlIHVzaW5nIHRoZSd9ID0gJ3RpY2tldHMgZW4gU3RhdGljREIgbG9ja19pbmRleCBwZXJvIHNlIGVzdGEgdXNhbmRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2luZGV4LiBQbGVhc2UgcnVuIG90cnMvYmluL290cnMuQ2xlYW5UaWNrZXRJbmRleC5wbCB0byBjbGVhbiB0aGUgU3RhdGljREIgaW5kZXguJ30gPSAnaW5kaWNlLiBQb3IgZmF2b3IgZWplY3V0ZSBvdHJzL2Jpbi9vdHJzLkNsZWFuVGlja2V0SW5kZXgucGwgcGFyYSBsaW1waWFyIGVsIGluZGljZSBTdGF0aWNEQic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd0aWNrZXRzIGluIFN0YXRpY0RCIGluZGV4IGJ1dCB5b3UgYXJlIHVzaW5nIHRoZSd9ID0gJ3RpY2tldHMgZW4gZWwgaW5kaWNlIFN0YXRpY0RCIHBlcm8gc2UgZXN0YSB1c2FuZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2tpcHBpbmcgdGVzdC4nfSA9ICdPbWl0aWVuZG8gcmV2aXNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9ycGhhbmVkIHJlY29yZHMgZm91bmQuJ30gPSAnTm8gc2UgZW5jb250cmFyb24gZW50cmFkYXMgaHVlcmZhbmFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldFN0YXRpY0RCT3JwaGFuZWRSZWNvcmRzJ30gPSAnVGlja2V0U3RhdGljREJPcnBoYW5lZFJlY29yZHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgb3JwaGFuZWQgU3RhdGljREIgcmVjb3Jkcy4nfSA9ICdWZXJpZmljYSBlbnRyYWRhcyBodWVyZmFuYXMgZW4gU3RhdGljREInOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FydGljbGVzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZCBmb3IgT1RSUyAyLjMgYW5kIGhpZ2hlci4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9CiAgICAgICAgJ2FydGljdWxvcyBlbiBlbCBzaXN0ZW1hLiBEZWJlIHV0aWxpemFyIGVsIG1vZHVsbyBTdGF0aWNEQiBwYXJhIE9UUlMgMi4zIHkgc3VwZXJpb3IuIFZlYSBlbCBtYW51YWwgZGUgYWRtaW5pc3RyYWNpw7NuIChBanVzdGVzIGRlIHJlbmRpbWllbnRvKSBwYXJhIG1hcyBpbmZvcm1hY2nDs24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FydGljbGVzIGluIHlvdXIgc3lzdGVtLid9ID0gJ2FydGljdWxvcyBlbiBlbCBzaXN0ZW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlIHNldHRpbmcuJ30gPSAnVmVyaWZpY2EgbGEgY29uZmlndXJhY2nDs24gVGlja2V0OjpTZWFyY2hJbmRleE1vZHVsZS4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBzaG91bGQgbm90IGhhdmUgbW9yZSB0aGFuIDgwMDAgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3UgY3VycmVudGx5IGhhdmUgb3ZlciA4OTk5OSEgSW4gY2FzZSB5b3Ugd2FudCB0byBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UsIGNsb3NlIG5vdCBuZWVkZWQgb3BlbiB0aWNrZXRzLid9ID0KICAgICAgICAnTm8gZGViZSB0ZW5lciBtYXMgZGUgODAwMCB0aWNrZXRzIGFiaWVydG9zIGVuIGVsIHNpc3RlbWEuIFNlIGN1ZW50YSBhY3R1YWxtZW50ZSBjb24gbWFzIGRlIDg5OTk5ISBFbiBjYXNvIGRlIHF1ZSBxdWllcmEgbWVqb3JhciBlbCByZW5kaW1pZW50byBkZWwgc2lzdGVtYSwgY2llcnJlIGxvcyB0aWNrZXRzIHF1ZSBubyBzZSBuZWNlc2l0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBzaG91bGQgbm90IGhhdmUgb3ZlciA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlICd9ID0gJ05vIGRlYmUgdGVuZXIgYXJyaWJhIGRlIDgwMDAgdGlja2V0cyBhYmllcnRvcyBlbiBlbCBzaXN0ZW1hLiBVc3RlZCBhY3R1YWxtZW50ZSB0aWVuZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbiBjYXNlIHlvdSB3YW50IHRvIGltcHJvdmUgeW91ciBwZXJmb3JtYW5jZSwgY2xvc2Ugbm90IG5lZWRlZCBvcGVuIHRpY2tldHMuJ30gPSAnRW4gY2FzbyBkZSBxdWUgcXVpZXJhIG1lam9yYXIgZWwgcmVuZGltaWVudG8sIGNpZXJyZSBsb3MgdGlja2V0cyBxdWUgbm8gc2UgbmVjZXNpdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbiA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlICd9ID0gJ05vIGRlYmUgdGVuZXIgbWFzIGRlIDgwMDAgdGlja2V0cyBhYmllcnRvcyBlbiBlbCBzaXN0ZW1hLiBVc3RlZCBhY3R1YWxtZW50ZSB0aWVuZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSAnfSA9ICdTZSB0aWVuZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4nfSA9ICcgdGlja2V0cyBhYmllcnRvcyBlbiBlbCBzaXN0ZW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuVGlja2V0Q2hlY2snfSA9ICdPcGVuVGlja2V0Q2hlY2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2sgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLid9ID0gJ1ZlcmlmaWNhIHRpY2tldHMgYWJpZXJ0b3MgZW4gZWwgc2lzdGVtYS4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZRRE5Db25maWdDaGVjayd9ID0gJ0ZRRE5Db25maWdDaGVjayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiB0aGUgY29uZmlndXJlZCBGUUROIGlzIHZhbGlkLid9ID0gJ1ZlcmlmaWNhIHNpIGVsIEZRRE4gY29uZmlndXJhZG8gZXMgdmFsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY29uZmlndXJlIHlvdXIgRlFETiBpbnNpZGUgdGhlIFN5c0NvbmZpZyBtb2R1bGUuIChjdXJyZW50bHkgdGhlIGRlZmF1bHQgc2V0dGluZyd9ID0gJ1BvciBmYXZvciBjb25maWd1cmUgc3UgRlFETiBkZW50cm8gZGVsIG1vZHVsbyBkZSBjb25maWd1cmFjacOzbi4gKGFjdHVhbG1lbnRlIGVsIHZhbG9yIHBvciBvbWlzaW9uIGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIGVuYWJsZWQpLid9ID0gJ3NlIGVuY3VlbnRyYSBoYWJpbGl0YWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIEZRRE4nfSA9ICdGUUROIGludmFsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydsb29rcyBnb29kLid9ID0gJ2x1Y2UgYmllbi4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbUlEQ29uZmlnQ2hlY2snfSA9ICdTeXN0ZW1JRENvbmZpZ0NoZWNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGlmIHRoZSBjb25maWd1cmVkIFN5c3RlbUlEIGNvbnRhaW5zIG9ubHkgZGlnaXRzLid9ID0gJ1ZlcmlmaWNhIHNpIGVsIFN5c3RlbUlEIGNvbmZpZ3VyYWRvIGVuIGVsIHNpc3RlbWEgY29udGllbmUgc29sbyBkaWdpdG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3VyIFN5c3RlbUlEIHNldHRpbmcgaXMnfSA9ICdFbCBTeXN0ZW1JRCBlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgU3lzdGVtSUQnfSA9ICdFbCBTeXN0ZW1JRCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydtdXN0IGNvbnNpc3Qgb2YgZGlnaXRzIGV4Y2x1c2l2ZWx5Lid9ID0gJ2RlYmUgY29uc2lzdGlyIGRlIGRpZ2l0b3MgZXhjbHVzaXZhbWVudGUuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNwb25zZUZvcm1hdENoZWNrJ30gPSAnUmVzcG9uc2VGb3JtYXRDaGVjayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiBUaWNrZXQ6OkZyb250ZW5kOjpSZXNwb25zZUZvcm1hdCBjb250YWlucyBubyAkRGF0YXsiIn0uJ30gPSAnVmVyaWZpY2Egc2kgVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQgbm8gY29udGllbmUgJERhdGF7IiJ9Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd3YXMgbm90IGZvdW5kLid9ID0gJ25vIGZ1ZSBlbmNvbnRyYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgb3B0aW9uIFRpY2tldDo6RnJvbnRlbmQ6OlJlc3BvbnNlRm9ybWF0IGNvaW50YWlucyd9ID0gJ0xhIG9wY2nDs24gZGUgY29uZmlndXJhY2nDs24gVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQgY29udGllbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnc2hvdWxkIGJlIHVzZWQgaW5zdGFuZCAoc2VlIGRlZmF1bHQgc2V0dGluZykuJ30gPSAnZGViZSBzZXIgdXNhZG8gZW4gc3UgbHVnYXIgKHZlciBsYXMgb3BjaW9uZXMgZGUgY29uZmlndXJhY2nDs24pLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsZVN5c3RlbUNoZWNrJ30gPSAnRmlsZVN5c3RlbUNoZWNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGlmIGZpbGUgc3lzdGVtIGlzIHdyaXRhYmxlLid9ID0gJ1ZlcmlmaWNhIHNpIGVsIHNpc3RlbWEgZGUgYXJjaGl2b3MgdGllbmUgcGVybWlzb3MgZGUgZXNjcml0dXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBmaWxlIHN5c3RlbSBpcyB3cml0YWJsZS4nfSA9ICdFbCBzaXN0ZW1hIGRlIGFyY2hpdm9zIHRpZW5lIHBlcm1pc29zIGRlIGVzY3JpdHVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCBob21lIGRpcmVjdG9yeSd9ID0gJ05vIGVzIGVsIGRpcmVjdG9yaW8gaW5pY2lhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJDYW4ndCB3cml0ZSBmaWxlIn0gPSAnTm8gc2UgcHVlZGUgZXNjcmliaXIgZW4gYXJjaGl2byc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFja2FnZURlcGxveUNoZWNrJ30gPSAnUGFja2FnZURlcGxveUNoZWNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrIGRlcGxveW1lbnQgb2YgYWxsIHBhY2thZ2VzLid9ID0gJ1ZlcmlmaWNhIGxhIGNvbnNpc3RlbmNpYSBkZSB0b2RvcyBsb3MgcGFxdWV0ZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBwYWNrYWdlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZC4nfSA9ICdUb2RvcyBsb3MgcGFxdWV0ZXMgZXN0YW4gY29ycmVjdGFtZW50ZSBpbnN0YWxhZG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYWNrYWdlcyBub3QgY29ycmVjdGx5IGluc3RhbGxlZCd9ID0gJ1BhcXVldGVzIGluY29ycmVjdGFtZW50ZSBpbnN0YWxhZG9zJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkVXNlckxvY2tlZFRpY2tldFNlYXJjaCd9ID0gJ0ludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBmb3IgaW52YWxpZCB1c2VyIHdpdGggbG9ja2VkIHRpY2tldHMuJ30gPSAnQnVzY2EgdXN1YXJpb3MgaW52YWxpZG9zIGNvbiB0aWNrZXRzIGJsb3F1ZWFkb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIGFyZSBubyBpbnZhbGlkIHVzZXJzIHdpdGggbG9ja2VkIHRpY2tldHMuJ30gPSAnTm8gaGF5IHVzdWFyaW9zIGludmFsaWRvcyBjb24gdGlja2V0cyBibG9xdWVhZG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVzZSBpbnZhbGlkIHVzZXJzIGhhdmUgbG9ja2VkIHRpY2tldHMnfSA9ICdFc3RvcyB1c3VhcmlvcyBpbnZhbGlkb3MgdGllbmVuIHRpY2tldCBibG9xdWVhZG9zJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZhdWx0VXNlckNoZWNrJ30gPSAnRGVmYXVsdFVzZXJDaGVjayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBpZiByb290QGxvY2FsaG9zdCBhY2NvdW50IGhhcyB0aGUgZGVmYXVsdCBwYXNzd29yZC4nfSA9ICdWZXJpZmljYSBzaSBsYSBjdWVudGEgcm9vdEBsb2NhbGhvc3QgdGllbmUgbGEgY2xhdmUgcG9yIG9taXNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIGlzIG5vIGFjdGl2ZSByb290QGxvY2FsaG9zdCB3aXRoIGRlZmF1bHQgcGFzc3dvcmQuJ30gPSAnTGEgY3VlbnRhIHJvb3RAbG9jYWxob3N0IG9uIGVzdGEgYWN0aXZhIGNvbiBsYSBjbGF2ZSBwb3Igb21pc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiQ2hhbmdlIHRoZSBwYXNzd29yZCBvciBpbnZhbGlkYXRlIHRoZSBhY2NvdW50ICdyb290XEBsb2NhbGhvc3QnLiJ9ID0gJ01vZGlmaXF1ZSBsYSBjbGF2ZSBvIGludmFsaWRlIGxhIGN1ZW50YSByb290XEBsb2NhbGhvc3QnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NPQVBDaGVjayd9ID0gJ1NPQVBDaGVjayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVjayBkZWZhdWx0IFNPQVAgY3JlZGVudGlhbHMuJ30gPSAnVmVyaWZpY2EgbG9zIGRhdG9zIGRlICBhdXRlbnRpZmljYWNpw7NuIHBhcmEgU09BUC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm90IGVuYWJsZWQgU09BUCBvciBoYXZlIHNldCB5b3VyIG93biBwYXNzd29yZC4nfSA9ICdObyBzZSBlbmN1ZW50cmEgaGFiaWxpdGFkbyBTT0FQIG8gaGEgcHVlc3RvIHN1IHByb3BpYSBjbGF2ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCBhIHN0cm9uZyBwYXNzd29yZCBmb3IgU09BUDo6UGFzc3dvcmQgaW4gU3lzQ29uZmlnLid9ID0gJ1BvciBmYXZvciBpbmdyZXNlIHVuYSBjbGF2ZSBzZWd1cmEgcGFyYSBTT0FQOjpQYXNzd29yZCBlbiBsYSBjb25maWd1cmFjacOzbi4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luc3RhbGwgZGlyZWN0b3J5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb2R1Y3QnfSA9ICdQcm9kdWN0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXRzJ30gPSAnVGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FydGljbGVzJ30gPSAnQXJ0aWN1bG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50cyd9ID0gJ0FnZW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUm9sZXMnfSA9ICdSb2xlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHcm91cHMnfSA9ICdHcnVwb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJ0aWNsZXMgcGVyIHRpY2tldCAoYXZnKSd9ID0gJ0FydGljdWxvcyBwb3IgdGlja2V0IChwcm9tZWRpbyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlcmF0aW5nIHN5c3RlbSd9ID0gJ1Npc3RlbWEgT3BlcmF0aXZvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRocyBiZXR3ZWVuIGZpcnN0IGFuZCBsYXN0IHRpY2tldCd9ID0gJ01lc2VzIGVudHJlIGVsIHByaW1lciB5IHVsdGltbyB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0cyBwZXIgbW9udGggKGF2ZyknfSA9ICdUaWNrZXQgcG9yIG1lcyAocHJvbWVkaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0F0dGFjaG1lbnRzIHBlciB0aWNrZXQgKGF2ZyknfSA9ICdQcm9tZWRpbyBkZSBhcmNoaXZvcyBhZGp1bnRvcyBwb3IgdGlja2V0IChwcm9tZWRpbyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXR0YWNobWVudCBzaXplIChhdmcpJ30gPSAnVGFtYcOxbyBkZSBhcmNoaXZvIGFkanVudG8gKHByb21lZGlvKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsU3lzdGVtT3ZlcnZpZXcnfSA9ICdHZW5lcmFsU3lzdGVtT3ZlcnZpZXcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzcGxheSBhIGdlbmVyYWwgc3lzdGVtIG92ZXJ2aWV3J30gPSAnTXVlc3RyYSB1bmEgdmlzdGEgZ2VuZXJhbCBkZSBzaXN0ZW1hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBzeXN0ZW0uJ30gPSAnSW5mb3JtYWNpw7NuIGdlbmVyYWwgZGVsIHNpc3RlbWEuJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pblN1cHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIE9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTdXBwb3J0T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VyIGRhdGEKICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgc2VuZGVyIGVtYWlsIGFkcmVzcwogICAgbXkgJFNlbmRlckFkcmVzcyA9ICcnOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6U2VuZGVyRW1haWwnKSApIHsKICAgICAgICAkU2VuZGVyQWRyZXNzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OlNlbmRlckVtYWlsJyk7CiAgICB9CiAgICBlbHNpZiAoICRVc2Vye1VzZXJFbWFpbH0gJiYgJFVzZXJ7VXNlckVtYWlsfSAhfiAvcm9vdFxAbG9jYWxob3N0LyApIHsKICAgICAgICAkU2VuZGVyQWRyZXNzID0gJFVzZXJ7VXNlckVtYWlsfTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQWRtaW5FbWFpbCcpCiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FkbWluRW1haWwnKSAhfiAvcm9vdFxAbG9jYWxob3N0LwogICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZG1pbkVtYWlsJykgIX4gL2FkbWluXEBleGFtcGxlLmNvbS8KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbmRlckFkcmVzcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZG1pbkVtYWlsJyk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBDb25maWRlbnRpYWwKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ29uZmlkZW50aWFsJyApIHsKCiAgICAgICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlkZW50aWFsJywKICAgICAgICApOwoKICAgICAgICBpZiAoICRVc2Vye1VzZXJMYW5ndWFnZX0gJiYgJFVzZXJ7VXNlckxhbmd1YWdlfSA9fiAvZGUvICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlkZW50aWFsQ29udGVudERFJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb25maWRlbnRpYWxDb250ZW50RU4nLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFNlbmRlciBJbmZvcm1hdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZW5kZXJJbmZvcm1hdGlvbicgKSB7CgogICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlbmRlckluZm9ybWF0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZW5kZXJBZHJlc3MgICAgID0+ICRTZW5kZXJBZHJlc3MsCiAgICAgICAgICAgICAgICBTZW5kZXJTYWx1dGF0aW9uID0+ICRVc2Vye1VzZXJTYWx1dGF0aW9ufSwKICAgICAgICAgICAgICAgIFNlbmRlck5hbWUgICAgICAgPT4gJFVzZXJ7VXNlckZpcnN0bmFtZX0gLiAnICcgLiAkVXNlcntVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBVcGxvYWRTdXBwb3J0SW5mbwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdWJtaXQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlQ3VzdG9tZXJJbmZvOwogICAgICAgIGZvciBteSAkS2V5IChxdyhTZW5kZXIgQ29tcGFueSBTYWx1dGF0aW9uIE5hbWUgU3RyZWV0IFppcCBDaXR5IFBob25lIFNlbmRJbmZvIEJ1Z3ppbGxhSUQpKSB7CiAgICAgICAgICAgICRDdXN0b21lckluZm97JEtleX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlIGJ1dHRvbiBzZW5kIGJlY29tZXMgdGhlIHN1Ym1pdAogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VuZCcgKSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZW5kZXJJbmZvcm1hdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTZW5kZXJBZHJlc3MgICAgID0+ICRTZW5kZXJBZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyU2FsdXRhdGlvbiA9PiAkVXNlcntVc2VyU2FsdXRhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyTmFtZSAgICAgICA9PiAkVXNlcntVc2VyRmlyc3RuYW1lfSAuICcgJyAuICRVc2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFNlbmRNZXNzYWdlID0gJFNlbGYtPntTdXBwb3J0T2JqZWN0fS0+U2VuZEluZm8oCiAgICAgICAgICAgICAgICBDdXN0b21lckluZm8gPT4gXCVDdXN0b21lckluZm8sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VuZE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+ICdTZW50IHBhY2thZ2UgdG8gT1RSUyBHcm91cC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+ICdDYW4gbm90IHNlbmQgZW1haWwgdG8gT1RSUyBHcm91cCEnIC4gIlxuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIllvdSBjYW4gZG93bmxvYWQgdGhlIHN1cHBvcnQgcGFja2FnZSBhbmQgc2VuZCBpdCBpbiBtYW51YWxseSBpZiBuZWVkZWQuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIklmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBPVFJTIHNlcnZpY2VzIHBsZWFzZSBzZW5kIHRoZSBwYWNrYWdlIHRvIHN1cHBvcnRcQG90cnMuY29tIG9yIGNhbGxcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAib3VyIHRlYW0gYnkgcGhvbmUgdG8gcmV2aWV3IHRoZSBuZXh0IHN0ZXAuXG5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgT1RSUyBzZXJ2aWNlcyBhcyB3ZWxsIGFzIGNvbnRhY3QgaW5mb3JtYXRpb24gYXRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAnaHR0cDovL3d3dy5vdHJzLmNvbS8nIC4gIlxuXG4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZSBidXR0b24gZG93bmxvYWQgYmVjb21lcyB0aGUgc3VibWl0CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICBteSAoICRDb250ZW50LCAkRmlsZW5hbWUgKSA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPkRvd25sb2FkKAogICAgICAgICAgICAgICAgJUN1c3RvbWVySW5mbywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmV0dXJuIGZpbGUKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJHskQ29udGVudH0sCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNoZWQnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFNRTCBiZW5jaCBJbml0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0JlbmNobWFya1NRTEluaXQnICkgewoKICAgICAgICAjIHNlbGVjdGlvbiBkYXRhIGZvciBiZW5jaG1hcmsgZHJvcGRvd24gbGlzdAogICAgICAgIG15ICVTZWxlY3Rpb25EYXRhID0gKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgKiBOb3JtYWwgKGNhLiAyNSBzZWMpJywKICAgICAgICAgICAgICAgIDMgPT4gJzMgKiBIaWdoICAgKGNhLiA3NSBzZWMpJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgKiBIZWF2eSAgKGNhLiAxMjUgc2VjKScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5hbWUgPT4gJ01vZGUnLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgTGF5b3V0IG9iamVjdCBrbm93cyB0aGUgZnVuY3Rpb24gQnVpbGRTZWxlY3Rpb24KICAgICAgICAjIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2xkZXIgb3RycyB2ZXJzaW9ucyB1c2UgT3B0aW9uU3RyZ0hhc2hSZWYgaW5zdGVhZAogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT5jYW4oJ0J1aWxkU2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBmb3IgYmVuY2htYXJrIHRlc3QKICAgICAgICAgICAgJFBhcmFte01vZGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oJVNlbGVjdGlvbkRhdGEpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIGZvciBiZW5jaG1hcmsgdGVzdAogICAgICAgICAgICAkUGFyYW17TW9kZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZiglU2VsZWN0aW9uRGF0YSk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHRJbml0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBNb2RlU3RyZyA9PiAkUGFyYW17TW9kZVN0cmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU3VwcG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFNRTCBiZW5jaAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdCZW5jaG1hcmtTUUwnICkgewoKICAgICAgICBteSAkTW9kZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ01vZGUnICk7CgogICAgICAgIG15ICVNb29kID0gKCAnRmluZScsICc6LSknLCAnT2snLCAnOi18JywgJ1dyb25nJywgJzotKCcgKTsKCiAgICAgICAgbXkgJUJlbmNoVGVzdCA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPkJlbmNobWFyaygKICAgICAgICAgICAgTW9kZSA9PiAkTW9kZSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVCZW5jaFRlc3QsCiAgICAgICAgICAgICAgICBIZWFkID0+ICdTUUwnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgSW5zZXJ0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnSW5zZXJ0IFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSAgPT4gJEJlbmNoVGVzdHtJbnNlcnRUaW1lfSwKICAgICAgICAgICAgICAgIE1vb2QgID0+ICRNb29keyAkQmVuY2hUZXN0e0luc2VydFJlc3VsdH0gfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICggMTAwMDAgKiAkTW9kZSApLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0Um93JyAuICRCZW5jaFRlc3R7SW5zZXJ0UmVzdWx0fSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTaG91bGRUYWtlID0+ICRCZW5jaFRlc3R7SW5zZXJ0U2hvdWxkVGFrZX0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBVcGRhdGUKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdVcGRhdGUgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lICA9PiAkQmVuY2hUZXN0e1VwZGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgTW9vZCAgPT4gJE1vb2R7ICRCZW5jaFRlc3R7VXBkYXRlUmVzdWx0fSB9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gKCAxMDAwMCAqICRNb2RlICksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHRSb3cnIC4gJEJlbmNoVGVzdHtVcGRhdGVSZXN1bHR9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNob3VsZFRha2UgPT4gJEJlbmNoVGVzdHtVcGRhdGVTaG91bGRUYWtlfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFRpbWUKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdTZWxlY3QgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lICA9PiAkQmVuY2hUZXN0e1NlbGVjdFRpbWV9LAogICAgICAgICAgICAgICAgTW9vZCAgPT4gJE1vb2R7ICRCZW5jaFRlc3R7U2VsZWN0UmVzdWx0fSB9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gKCAxMDAwMCAqICRNb2RlICksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHRSb3cnIC4gJEJlbmNoVGVzdHtTZWxlY3RSZXN1bHR9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNob3VsZFRha2UgPT4gJEJlbmNoVGVzdHtTZWxlY3RTaG91bGRUYWtlfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0RlbGV0ZSBUaW1lJywKICAgICAgICAgICAgICAgIFRpbWUgID0+ICRCZW5jaFRlc3R7RGVsZXRlVGltZX0sCiAgICAgICAgICAgICAgICBNb29kICA9PiAkTW9vZHsgJEJlbmNoVGVzdHtEZWxldGVSZXN1bHR9IH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAoIDEwMDAwICogJE1vZGUgKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycgLiAkQmVuY2hUZXN0e0RlbGV0ZVJlc3VsdH0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2hvdWxkVGFrZSA9PiAkQmVuY2hUZXN0e0RlbGV0ZVNob3VsZFRha2V9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ011bHRpcGxpZXInLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gIiogJE1vZGUiLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVCZW5jaFRlc3QsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2UgewoKICAgICAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGdldCByZXN1bHQgb2YgYWxsIGFkbWluIGNoZWNrcwogICAgICAgIG15ICREYXRhSGFzaCA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPkFkbWluQ2hlY2tzR2V0KCkgfHwge307CgogICAgICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JERhdGFIYXNofSApIHsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld01vZHVsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBST1dIQVNIOgogICAgICAgICAgICBmb3IgbXkgJFJvd0hhc2ggKCBAeyAkRGF0YUhhc2gtPnskTW9kdWxlfSB9ICkgewoKICAgICAgICAgICAgICAgIG5leHQgUk9XSEFTSCBpZiAhJFJvd0hhc2g7CiAgICAgICAgICAgICAgICBuZXh0IFJPV0hBU0ggaWYgcmVmICRSb3dIYXNoIG5lICdIQVNIJzsKICAgICAgICAgICAgICAgIG5leHQgUk9XSEFTSCBpZiAhJXskUm93SGFzaH07CgogICAgICAgICAgICAgICAgJFJvd0hhc2gtPntCbG9ja1N0eWxlfSB8fD0gJyc7CgogICAgICAgICAgICAgICAgaWYgKCAkUm93SGFzaC0+e0Jsb2NrU3R5bGV9IG5lICdUYWJsZURhdGFTaW1wbGUnICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNyZWF0ZSBuZXcgYmxvY2sgd2l0aCByb3RhdG9yeSBjc3MKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld01vZHVsZVJvdycgLiAkUm93SGFzaC0+e0Jsb2NrU3R5bGV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFJvd0hhc2h9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdNb2R1bGVSb3dUYWJsZURhdGFTaW1wbGUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFJvd0hhc2h9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG15ICVUYWJsZVZhbHVlczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCByZWYgJFJvd0hhc2gtPntUYWJsZUluZm99IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJVRhYmxlVmFsdWVzID0gJXsgJFJvd0hhc2gtPntUYWJsZUluZm99IH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAlVGFibGVWYWx1ZXMgPSBzcGxpdCAvWz07XG5dLywgJFJvd0hhc2gtPntUYWJsZUluZm99OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVUYWJsZVZhbHVlcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TW9kdWxlVGFibGVSb3cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUtleSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICRUYWJsZVZhbHVlc3skSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgU3VwcG9ydG1vZHVsZSBvdmVydmlldyBwYWdlCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8ZGl2IGNsYXNzPSJNYWluQm94IEFkbWluU3VwcG9ydCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDE+JFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJTdXBwb3J0IEFzc2Vzc21lbnQifTwvaDE+CgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiQWN0aW9ucyJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9J0NvbnRlbnQnPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPUNvbmZpZGVudGlhbCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPiRUZXh0eyJTdGFydCBzdXBwb3J0In08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1CZW5jaG1hcmtTUUxJbml0IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+JFRleHR7IlNRTCBiZW5jaG1hcmsifTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7Ik5vdGUifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSdDb250ZW50Jz4KICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJGb3IgcXVpY2sgaGVscCBwbGVhc2Ugc3VibWl0IHlvdXIgc3lzdGVtIGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYSBzdXBwb3J0IHRpY2tldCBhdCB0aGUgdmVuZG9yJ3Mgc2l0ZS4ifQogICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7IkZvciBtb3JlIGluZm8gcGxlYXNlIGNoZWNrIn0gPGEgaHJlZj0iaHR0cDovL290cnMuY29tLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9vdHJzLmNvbS88L2E+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlIC0tPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iJFRleHR7IlNob3cgb3IgaGlkZSB0aGUgY29udGVudCJ9Ij48aSBjbGFzcz0iaWNvbi1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJpY29uLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiJERhdGF7Ik1vZHVsZSJ9In08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93IC0tPgogICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQ2hlY2tSZXN1bHQgQ2hlY2tSZXN1bHQkUURhdGF7IkNoZWNrIn0iPgogICAgICAgICAgICAgICAgICAgICAgICA8aDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iJFFEYXRheyJDaGVjayJ9IiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JFFEYXRheyJDaGVjayJ9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJEZXNjcmlwdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPiRRRGF0YXsiQ29tbWVudCJ9PC9wPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVJvdyAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGVSb3dUZXh0QXJlYSAtLT4KICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkNoZWNrUmVzdWx0IENoZWNrUmVzdWx0JFFEYXRheyJDaGVjayJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IiRRRGF0YXsiQ2hlY2sifSIgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRRRGF0YXsiQ2hlY2sifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRGVzY3JpcHRpb24ifQogICAgICAgICAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iU3BhY2luZ1RvcFNtYWxsIj4kUURhdGF7IkNvbW1lbnQifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9IlcxMDBwYyIgcm93cz0iNyIgY29scz0iIiByZWFkb25seT0icmVhZG9ubHkiPiRRRGF0YXsiQ29udGVudFN0cmluZyJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93VGV4dEFyZWEgLS0+CgoKCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93VGFibGVEYXRhU2ltcGxlIC0tPgogICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQ2hlY2tSZXN1bHQgQ2hlY2tSZXN1bHQkUURhdGF7IkNoZWNrIn0iPgogICAgICAgICAgICAgICAgICAgICAgICA8aDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iJFFEYXRheyJDaGVjayJ9IiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JFFEYXRheyJDaGVjayJ9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJEZXNjcmlwdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPiRRRGF0YXsiQ29tbWVudCJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj5JdGVtPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj5WYWx1ZTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlVGFibGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPiRRRGF0YXsiSXRlbUtleSJ9PC9zdHJvbmc+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IlZhbHVlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVRhYmxlUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGVSb3dUYWJsZURhdGFTaW1wbGUgLS0+CgoKCgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGUgLS0+CiAgICA8L2Rpdj4KPC9kaXY+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgoKCiMgU3VwcG9ydG1vZHVsZSBjb25maWRlbnRpYWwgcGFnZQo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWwgLS0+CjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJBZG1pbiBTdXBwb3J0IEluZm8ifTwvaDE+CiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJBY3Rpb25zIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPiRUZXh0eyJHbyB0byBvdmVydmlldyJ9PC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249QmVuY2htYXJrU1FMSW5pdCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPiRUZXh0eyJTUUwgYmVuY2htYXJrIn08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7IkNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgQ2VudGVyIj4KCiRJbmNsdWRleyJBZG1pblN1cHBvcnRMaWNlbnNlVGV4dCJ9CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCBDZW50ZXJCb3ggVzUwcGMiPgogICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlJpZ2h0IFNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlbmRlckluZm9ybWF0aW9uIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBY2NlcHQgbGljZW5zZSJ9Ij4kVGV4dHsiQWNjZXB0IGxpY2Vuc2UifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGNsYXNzPSJSaWdodCBTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJEb24ndCBhY2NlcHQgbGljZW5zZSJ9Ij4kVGV4dHsiRG9uJ3QgYWNjZXB0IGxpY2Vuc2UifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsIC0tPgoKIyBTdXBwb3J0bW9kdWxlIHNlbmRlciBhbmQgc3lzdGVtIGluZm9ybWF0aW9uCjwhLS0gZHRsOmJsb2NrOlNlbmRlckluZm9ybWF0aW9uIC0tPgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMT4kVGV4dHsiQWRtaW4gU3VwcG9ydCBJbmZvIn08L2gxPgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiQWN0aW9ucyJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIj48c3Bhbj4kVGV4dHsiR28gdG8gb3ZlcnZpZXcifTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiVmVuZG9yIFN1cHBvcnQifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IFdpdGhQYWRkaW5nIj4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdWJtaXQiLz4KPCEtLSBkdGw6YmxvY2s6U2VuZGVySW5mb3JtYXRpb25IaWRkZW4gLS0+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIkUURhdGF7IlZhbHVlIn0iLz4KPCEtLSBkdGw6YmxvY2s6U2VuZGVySW5mb3JtYXRpb25IaWRkZW4gLS0+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTYWx1dGF0aW9uIj4kVGV4dHsiU2FsdXRhdGlvbiJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iU2FsdXRhdGlvbiIgbmFtZT0iU2FsdXRhdGlvbiIgdmFsdWU9IiRRRGF0YXsiU2VuZGVyU2FsdXRhdGlvbiJ9IiBjbGFzcz0iVzUwcGMiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5hbWUiPiRUZXh0eyJOYW1lIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJOYW1lIiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJTZW5kZXJOYW1lIn0iIGNsYXNzPSJXNTBwYyIgcmVhZG9ubHk9InJlYWRvbmx5IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VuZGVyIj4kVGV4dHsiRW1haWwifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlNlbmRlciIgbmFtZT0iU2VuZGVyIiB2YWx1ZT0iJFFEYXRheyJTZW5kZXJBZHJlc3MifSIgY2xhc3M9Ilc1MHBjIiByZWFkb25seT0icmVhZG9ubHkiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21wYW55Ij4kVGV4dHsiQ29tcGFueSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iQ29tcGFueSIgbmFtZT0iQ29tcGFueSIgdmFsdWU9IiIgY2xhc3M9Ilc1MHBjIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RyZWV0Ij4kVGV4dHsiU3RyZWV0In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJTdHJlZXQiIG5hbWU9IlN0cmVldCIgdmFsdWU9IiIgY2xhc3M9Ilc1MHBjIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWmlwIj4kVGV4dHsiWmlwIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJaaXAiIG5hbWU9IlppcCIgdmFsdWU9IiIgY2xhc3M9Ilc1MHBjIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ2l0eSI+JFRleHR7IkNpdHkifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkNpdHkiIG5hbWU9IkNpdHkiIHZhbHVlPSIiIGNsYXNzPSJXNTBwYyIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlBob25lIj4kVGV4dHsiUGhvbmUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlBob25lIiBuYW1lPSJQaG9uZSIgdmFsdWU9IiIgY2xhc3M9Ilc1MHBjIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQnVnemlsbGFJRCI+JFRleHR7IkJ1Z3ppbGxhIElEIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJCdWd6aWxsYUlEIiBuYW1lPSJCdWd6aWxsYUlEIiB2YWx1ZT0iIiBjbGFzcz0iVzUwcGMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+JFRleHR7IklmIHlvdSd2ZSBhbHJlYWR5IGFkZGVkIGEgQnVnemlsbGEgcmVwb3J0IGF0IGJ1Z3Mub3Rycy5vcmcsIHBsZWFzZSBhZGQgeW91ciBCdWd6aWxsYSBJRCBoZXJlLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz4kVGV4dHsiU2VydmljZSBDb250cmFjdCJ9PC9zdHJvbmc+PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJTZW5kSW5mbyIgbmFtZT0iU2VuZEluZm8iIHZhbHVlPSIxIiBjaGVja2VkPSJjaGVja2VkIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlBsZWFzZSByZWNvbW1lbmQgbWUgYSBTZXJ2aWNlIENvbnRyYWN0IHRvIG9wdGltaXplIG15IE9UUlMifS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgaWQ9IkRvd25sb2FkIiBuYW1lPSJEb3dubG9hZCIgdmFsdWU9IiRUZXh0eyJEb3dubG9hZCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBpZD0iU2VuZCIgbmFtZT0iU2VuZCIgdmFsdWU9IiRUZXh0eyJTZW5kIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAgICAgICAgICQoJyNEb3dubG9hZCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBpZiAoJCgnI1NlbmRlcicpLnZhbCgpID09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkNhbid0IGNyZWF0ZSBzdXBwb3J0IHBhY2thZ2UsIGJlY2F1c2UgeW91IHdvcmsgY3VycmVudGx5IHdpdGggdGhlIHN5c3RlbSB1c2VyIHJvb3RAbG9jYWxob3N0IGFuZCB5b3VyIGFkbWluIGVtYWlsIGFkZHJlc3MgaXMgbm90IHlldCBjb25maWd1cmVkLiBQbGVhc2UgZGVmaW5lIHRoZSBhZG1pbiBlbWFpbCBzZXR0aW5nIGluIHRoZSBTeXNDb25maWcgbW9kdWxlIGFuZCBkb24ndCB1c2UgdGhlIHVzZXIgcm9vdEBsb2NhbGhvc3QgZm9yIHdvcmtpbmcgd2l0aCBPVFJTLiJ9Jyk7CiAgICAgICAgICAgICAgICAgICAgJCgnI1NlbmRlcicpLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJCgnI1NlbmQnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgaWYgKCEkKCcjU2VuZEluZm8nKS5hdHRyKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiUGxlYXNlIGNvbmZpcm0gdGhlIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiB0byBjb250aW51ZS4ifScpOwogICAgICAgICAgICAgICAgICAgICQoJyNTZW5kSW5mbycpLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIC8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8IS0tIGR0bDpibG9jazpTZW5kZXJJbmZvcm1hdGlvbiAtLT4KCiMgU3VwcG9ydG1vZHVsZSBiZW5jaG1hcmsgcmVzdWx0CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdCAtLT4KPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgIDxoMj4kVGV4dHsiUmVzdWx0In06ICRUZXh0eyIkRGF0YXsiSGVhZCJ9In08L2gyPgo8L2Rpdj4KPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgPHRoZWFkPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj4kVGV4dHsiS2V5In08L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXMjBwYyI+JFRleHR7IlZhbHVlIn08L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXMjBwYyI+JFRleHR7IlRpbWUifTwvdGg+CiAgICAgICAgICAgICAgICA8dGg+JFRleHR7IkNvbW1lbnQifTwvdGg+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdFJvdyAtLT4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiS2V5In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IlZhbHVlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICRRRGF0YXsiVGltZSJ9IHMgJFFEYXRheyJNb29kIn0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdFJvd0ZpbmUgLS0+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7Ikxvb2tzIGZpbmUhIn0KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93RmluZSAtLT4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93T0sgLS0+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik9rIn0KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93T0sgLS0+CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdFJvd1dyb25nIC0tPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJTaG91bGQgbm90IHRha2UgbW9yZSB0aGFuIn0gJERhdGF7IlNob3VsZFRha2UifSdzICRUZXh0eyJvbiBhbiBhdmVyYWdlIHN5c3RlbSJ9Lgo8IS0tIGR0bDpibG9jazpCZW5jaG1hcmtSZXN1bHRSb3dXcm9uZyAtLT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdFJvdyAtLT4KICAgICAgICA8L3Rib2R5PgogICAgPC90YWJsZT4KPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdCAtLT4KCiMgU3VwcG9ydG1vZHVsZSBCZW5jaG1hcmsgUmVzdWx0IEluaXQgcGFnZQo8IS0tIGR0bDpibG9jazpCZW5jaG1hcmtSZXN1bHRJbml0IC0tPgo8ZGl2IGNsYXNzPSJNYWluQm94IEFkbWluU3VwcG9ydCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDE+JFRleHR7IkJlbmNobWFyayJ9PC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJBY3Rpb25zIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0nQ29udGVudCc+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPiRUZXh0eyJHbyB0byBvdmVydmlldyJ9PC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiTm90ZSJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9J0NvbnRlbnQnPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IlNwYWNpbmdCb3R0b20iPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGVjdXRlIGEgU1FMIGJlbmNobWFyayB0ZXN0IG9uIHlvdXIgZGF0YWJhc2UgdG8gZmluZCBvdXQgaG93IGZhc3QgeW91ciBkYXRhYmFzZSBpcyAoZG9uZSBvbiBkZWRpY2F0ZWQgYmVuY2htYXJrIHRhYmxlKS4ifQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9Ildhcm5pbmciPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJUaGlzIHNob3VsZCBub3QgYmUgZG9uZSBvbiBwcm9kdWN0aW9uIHN5c3RlbXMhIn0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiIGlkPSJTUUxCZW5jaG1hcmtXaWRnZXQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJTUUwgYmVuY2htYXJrIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iVVJMIiBuYW1lPSJVUkwiIHZhbHVlPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1CZW5jaG1hcmtTUUwiLz4KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIFRvZ2dsZSIgPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik1vZGUiPiRUZXh0eyJNdWx0aXBsaWVyIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJNb2RlU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiUGxlYXNlIHNlbGVjdCBhIG11bHRpcGxpZXIgYW5kIHByZXNzIHN0YXJ0IGJ1dHRvbi4ifTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IlNlbmRSZXF1ZXN0IiBjbGFzcz0iUHJpbWFyeSIgdmFsdWU9IiRUZXh0eyJTdGFydCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRUZXh0eyJTdGFydCJ9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBpZD0iQ29udGVudFRvVXBkYXRlIiBjbGFzcz0iV2lkZ2V0U2ltcGxlIEhpZGRlbiI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI1NlbmRSZXF1ZXN0JykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICQoJyNTUUxCZW5jaG1hcmtXaWRnZXQnKS5hZGRDbGFzcygnTG9hZGluZycpOwogICAgJCgnI1NlbmRSZXF1ZXN0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIHZhciBVUkwgPSAkKCcjVVJMJykudmFsKCkgKyAnO01vZGU9JyArICQoJyNNb2RlJykudmFsKCk7CiAgICBDb3JlLkFKQVguQ29udGVudFVwZGF0ZSgkKCcjQ29udGVudFRvVXBkYXRlJyksIFVSTCwgZnVuY3Rpb24gKCkgewogICAgICAgICQoJyNDb250ZW50VG9VcGRhdGUnKS5zaG93KCk7CiAgICAgICAgJCgnI1NRTEJlbmNobWFya1dpZGdldCcpLnJlbW92ZUNsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgJCgnI1NlbmRSZXF1ZXN0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7CiAgICB9KTsKICAgIHJldHVybiBmYWxzZTsKfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgoKPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0SW5pdCAtLT4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbENvbnRlbnRERSAtLT4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJDb25maWRlbnRpYWwiIHJvd3M9IjIyIiBjb2xzPSI3OCIgcmVhZG9ubHk9InJlYWRvbmx5Ij5EYXRlbnNjaHV0egoKV2lyLCBkaWUgRmlybWEgT1RSUyBBRywgbmVobWVuIGRlbiBTY2h1dHogSWhyZXIgcGVycyZvdW1sO25saWNoZW4gRGF0ZW4gc2VociBlcm5zdCB1bmQgaGFsdGVuIHVucyBzdHJpa3QgYW4gZGllIFJlZ2VsbiBkZXIgRGF0ZW5zY2h1dHpnZXNldHplLiBBbGxlIFBhc3N3Jm91bWw7cnRlciB3ZXJkZW4gdm9yIGRlbSBWZXJzZW5kZW4gZGVyIEluZm9ybWF0aW9uZW4gYXV0b21hdGlzaWVydCB1bmtlbm50bGljaCBnZW1hY2h0LiBJbiBrZWluZW0gRmFsbCB3ZXJkZW4gZGllIGVyaG9iZW5lbiBEYXRlbiB2ZXJrYXVmdCBvZGVyIGF1cyBhbmRlcmVuIEdyJnV1bWw7bmRlbiBhbiB1bmF1dG9yaXNpZXJ0ZSBEcml0dGUgd2VpdGVyZ2VnZWJlbi4KCkRpZSBuYWNoZm9sZ2VuZGUgRXJrbCZhdW1sO3J1bmcgZ2lidCBJaG5lbiBlaW5lbiAmVXVtbDtiZXJibGljayBkYXImdXVtbDtiZXIsIHdpZSB3aXIgZGllc2VuIFNjaHV0eiBnZXcmYXVtbDtocmxlaXN0ZW4gdW5kIHdlbGNoZSBBcnQgdm9uIERhdGVuIHp1IHdlbGNoZW0gWndlY2sgJnV1bWw7YmVybWl0dGVsdCB3ZXJkZW4uCgpEYXRlbiZ1dW1sO2Jlcm1pdHRsdW5nIGR1cmNoIGRhcyAnU3VwcG9ydG1vZHVsJwpEaWUgRmlybWEgT1RSUyBBRyAmdXVtbDtiZXJtaXR0ZWx0IHVuZCBzcGVpY2hlcnQgSW5mb3JtYXRpb25lbiwgZGllIGR1cmNoIGRhcyAnU3VwcG9ydG1vZHVsJyBhbiBkaWUgRmlybWEgT1RSUyBBRyB2ZXJzZW5kZXQgd2VyZGVuLiBEYWJlaSBoYW5kZWx0IGVzIHNpY2ggdW0gYXVzc2NobGllJnN6bGlnO2xpY2ggdW0gRGF0ZW4sIGRpZSBkaWUgRmlybWEgT1RSUyBBRyBiZW4mb3VtbDt0aWd0LCB1bSBGdW5rdGlvbnNmJmF1bWw7aGlna2VpdCB1bmQgTGVpc3R1bmdzZiZhdW1sO2hpZ2tlaXQgZGVzIGJldHJvZmZlbmVuIE9UUlMtU2VydmVycyB6dSBhbmFseXNpZXJlbiwgb2RlciB1bSBlaW5lIEtvbnRha3RhdWZuYWhtZSB6dSBlcm0mb3VtbDtnbGljaGVuLgoKU2ljaGVyaGVpdCBJaHJlciBwZXJzJm91bWw7bmxpY2hlbiBEYXRlbgpEaWUgRmlybWEgT1RSUyBBRyBzY2gmdXVtbDt0enQgSWhyZSBwZXJzJm91bWw7bmxpY2hlbiBEYXRlbiB2b3IgdW5lcmxhdWJ0ZW4gWnVncmlmZiwgVmVyd2VuZHVuZyBvZGVyIFZlciZvdW1sO2ZmZW50bGljaHVuZy4gRGllIEZpcm1hIE9UUlMgQUcgc29yZ3QgZGFmJnV1bWw7ciwgZGFzcyB2b24gSWhuZW4gYXVmIGRlbSBTZXJ2ZXIgZ2VzcGVpY2hlcnRlIHBlcnMmb3VtbDtubGljaGUgSW5mb3JtYXRpb25lbiBpbiBlaW5lciBrb250cm9sbGllcnRlbiwgc2ljaGVyZW4gVW1nZWJ1bmcgdm9yIHVuZXJsYXVidGVtIFp1Z3JpZmYgdW5kIFZlciZvdW1sO2ZmZW50bGljaHVuZyBnZXNjaCZVdW1sO3R6dCBzaW5kLgoKV2VpdGVyZ2FiZSBJaHJlciBEYXRlbgpEaWUgRmlybWEgT1RSUyBBRyBnaWJ0IElocmUgRGF0ZW4gbmljaHQgYW4gRHJpdHRlIHdlaXRlciwgc29mZXJuIGRpZXMgbmljaHQgenVyIEFid2lja2x1bmcgZGVzIEdlc2NoJmF1bWw7ZnRzdmVya2VocmVzIG4mb3VtbDt0aWcgaXN0LgpTb3dlaXQgZGllIEZpcm1hIE9UUlMgQUcgZ2VzZXR6bGljaCBvZGVyIHBlciBHZXJpY2h0c2Jlc2NobHVzcyBkYXp1IHZlcnBmbGljaHRldCBpc3QsIGdlYmVuIHdpciBJaHJlIERhdGVuIG51ciBhbiBhdXNrdW5mdHNiZXJlY2h0aWd0ZSBzdGFhdGxpY2hlIEluc3RpdHV0aW9uZW4gdW5kIEJlaCZvdW1sO3JkZW4gd2VpdGVyLgoKJkF1bWw7bmRlcnVuZyBkaWVzZXIgRGF0ZW5zY2h1dHpiZXN0aW1tdW5nZW4KRGllIEZpcm1hIE9UUlMgQUcgYmVoJmF1bWw7bHQgc2ljaCBkYXMgUmVjaHQgdm9yLCBkaWVzZSBTaWNoZXJoZWl0cy0gdW5kIERhdGVuc2NodXR6bWEmc3psaWc7bmFobWVuIHp1IHZlciZhdW1sO25kZXJuLCBzb3dlaXQgZGllcyB3ZWdlbiBkZXIgdGVjaG5pc2NoZW4gRW50d2lja2x1bmcgZXJmb3JkZXJsaWNoIHdpcmQuIEluIHNvbGNoZW4gRiZhdW1sO2xsZW4gd2VyZGVuIHdpciBhdWNoIHVuc2VyZSBIaW53ZWlzZSB6dW0gRGF0ZW5zY2h1dHogZW50c3ByZWNoZW5kIGFucGFzc2VuLiBCaXR0ZSBiZWFjaHRlbiBTaWUgZGFoZXIgZGllIGpld2VpbHMgYWt0dWVsbGUgVmVyc2lvbiB1bnNlcmVyIERhdGVuc2NodXR6ZXJrbCZhdW1sO3J1bmcuCgpBdXNrdW5mdHNyZWNodApTaWUgaGFiZW4gamVkZXJ6ZWl0IGRhcyBSZWNodCBhdWYgQXVza3VuZnQgJnV1bWw7YmVyIGRpZSBiZXomdXVtbDtnbGljaCBJaHJlciBQZXJzb24gZ2VzcGVpY2hlcnRlbiBEYXRlbiwgZGVyZW4gSGVya3VuZnQgdW5kIEVtcGYmYXVtbDtuZ2VyIHNvd2llIGRlbiBad2VjayBkZXIgRGF0ZW52ZXJhcmJlaXR1bmcuIEF1c2t1bmZ0ICZ1dW1sO2JlciBkaWUgZ2VzcGVpY2hlcnRlbiBEYXRlbiBrJm91bWw7bm5lbiBTaWUgdW50ZXIgaW5mb0BvdHJzLmNvbSBhbmZvcmRlcm4uCgpXZWl0ZXJlIEluZm9ybWF0aW9uZW4KSWhyIFZlcnRyYXVlbiBpc3QgdW5zIHdpY2h0aWcuIERhaGVyIGdlYmVuIHdpciBJaG5lbiBnZXJuZSBqZWRlcnplaXQgQXVza3VuZnQgJnV1bWw7YmVyIGRpZSBWZXJhcmJlaXR1bmcgSWhyZXIgcGVyc29uZW5iZXpvZ2VuZW4gRGF0ZW4uIFdlbm4gU2llIEZyYWdlbiBoYWJlbiwgZGllIElobmVuIGRpZXNlIERhdGVuc2NodXR6ZXJrbCZhdW1sO3J1bmcgbmljaHQgYmVhbnR3b3J0ZW4ga29ubnRlIG9kZXIgd2VubiBTaWUgd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVpbmVtIFB1bmt0IHcmdXVtbDtuc2NoZW4sIHdlbmRlbiBTaWUgc2ljaCBiaXR0ZSBtaXQgZWluZXIgRS1NYWlsIGFuIGluZm9Ab3Rycy5jb20uCiAgICAgICAgICAgICAgICA8L3RleHRhcmVhPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWxDb250ZW50REUgLS0+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbENvbnRlbnRFTiAtLT4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJDb25maWRlbnRpYWwiIHJvd3M9IjIyIiBjb2xzPSI3OCIgcmVhZG9ubHk9InJlYWRvbmx5Ij5EYXRhIFByb3RlY3Rpb24KCkhlcmUgYXQgT1RSUyBBRyB3ZSB0YWtlIHRoZSBwcm90ZWN0aW9uIG9mIHlvdXIgcGVyc29uYWwgZGV0YWlscyB2ZXJ5IHNlcmlvdXNseSBhbmQgc3RyaWN0bHkgYWRoZXJlIHRvIGRhdGEgcHJvdGVjdGlvbiBsYXdzLiBBbGwgcGFzc3dvcmRzIGFyZSBhdXRvbWF0aWNhbGx5IG1hZGUgdW5yZWNvZ25pemFibGUgYmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBpcyBzZW50LiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgYW55IGRhdGEgd2Ugb2J0YWluIGJlIHNvbGQgb3IgcGFzc2VkIG9uIHRvIHVuYXV0aG9yaXplZCB0aGlyZCBwYXJ0aWVzLgpUaGUgZm9sbG93aW5nIGV4cGxhbmF0aW9uIHByb3ZpZGVzIHlvdSB3aXRoIGFuIG92ZXJ2aWV3IG9mIGhvdyB3ZSBndWFyYW50ZWUgdGhpcyBwcm90ZWN0aW9uIGFuZCB3aGljaCB0eXBlIG9mIGRhdGEgaXMgY29sbGVjdGVkIGZvciB3aGljaCBwdXJwb3NlLgoKRGF0YSBIYW5kbGluZyB3aXRoICdTdXBwb3J0IE1vZHVsZScKSW5mb3JtYXRpb24gcmVjZWl2ZWQgdGhyb3VnaCB0aGUgJ1N1cHBvcnQgTW9kdWxlJyBpcyBzYXZlZCBieSBPVFJTIEFHLiBUaGlzIG9ubHkgYXBwbGllcyB0byBkYXRhIHRoYXQgT1RSUyBBRyByZXF1aXJlcyB0byBhbmFseXplIHRoZSBwZXJmb3JtYW5jZSBhbmQgZnVuY3Rpb24gb2YgdGhlIE9UUlMgc2VydmVyIG9yIHRvIGVzdGFibGlzaCBjb250YWN0LgoKU2FmZXR5IG9mIFBlcnNvbmFsIERldGFpbHMKT1RSUyBBRyBwcm90ZWN0cyB5b3VyIHBlcnNvbmFsIGRhdGEgZnJvbSB1bmF1dGhvcml6ZWQgYWNjZXNzLCB1c2Ugb3IgcHVibGljYXRpb24uIE9UUlMgQUcgZW5zdXJlcyB0aGF0IHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiB5b3Ugc3RvcmUgb24gdGhlIHNlcnZlciBpcyBwcm90ZWN0ZWQgZnJvbSB1bmF1dGhvcml6ZWQgYWNjZXNzIGFuZCBwdWJsaWNhdGlvbi4KCkRpc2Nsb3N1cmUgb2YgRGV0YWlscwpPVFJTIEFHIHdpbGwgbm90IHBhc3Mgb24geW91ciBkZXRhaWxzIHRvIHRoaXJkIHBhcnRpZXMgdW5sZXNzIHJlcXVpcmVkIGZvciBidXNpbmVzcyB0cmFuc2FjdGlvbnMuCk9UUlMgQUcgd2lsbCBvbmx5IHBhc3Mgb24geW91ciBkZXRhaWxzIHRvIGVudGl0bGVkIHB1YmxpYyBpbnN0aXR1dGlvbnMgYW5kIGF1dGhvcml0aWVzIGlmIHJlcXVpcmVkIGJ5IGxhdyBvciBjb3VydCBvcmRlci4KCkFtZW5kbWVudCBvZiBEYXRhIFByb3RlY3Rpb24gUG9saWN5Ck9UUlMgQUcgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIGFtZW5kIHRoaXMgc2VjdXJpdHkgYW5kIGRhdGEgcHJvdGVjdGlvbiBwb2xpY3kgaWYgcmVxdWlyZWQgYnkgdGVjaG5pY2FsIGRldmVsb3BtZW50cy4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgYWxzbyBhZGFwdCBvdXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGRhdGEgcHJvdGVjdGlvbiBhY2NvcmRpbmdseS4gUGxlYXNlIHJlZ3VsYXJseSByZWZlciB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2Ygb3VyIERhdGEgUHJvdGVjdGlvbiBQb2xpY3kuCgpSaWdodCB0byBJbmZvcm1hdGlvbgpZb3UgaGF2ZSB0aGUgcmlnaHQgdG8gZGVtYW5kIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGhlIGRhdGEgc2F2ZWQgYWJvdXQgeW91LCBpdHMgb3JpZ2luIGFuZCByZWNpcGllbnRzLCBhcyB3ZWxsIGFzIHRoZSBwdXJwb3NlIG9mIHRoZSBkYXRhIHByb2Nlc3NpbmcgYXQgYW55IHRpbWUuIFlvdSBjYW4gcmVxdWVzdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2F2ZWQgZGF0YSBieSBzZW5kaW5nIGFuIGUtbWFpbCB0byBpbmZvQG90cnMuY29tLgoKRnVydGhlciBJbmZvcm1hdGlvbgpZb3VyIHRydXN0IGlzIHZlcnkgaW1wb3J0YW50IHRvIHVzLiBXZSBhcmUgd2lsbGluZyB0byBpbmZvcm0geW91IGFib3V0IHRoZSBwcm9jZXNzaW5nIG9mIHlvdXIgcGVyc29uYWwgZGV0YWlscyBhdCBhbnkgdGltZS4gSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyB0aGF0IGhhdmUgbm90IGJlZW4gYW5zd2VyZWQgYnkgdGhpcyBEYXRhIFByb3RlY3Rpb24gUG9saWN5IG9yIGlmIHlvdSByZXF1aXJlIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyB0b3BpYywgcGxlYXNlIGNvbnRhY3QgaW5mb0BvdHJzLmNvbS4KCiAgICAgICAgICAgICAgICA8L3RleHRhcmVhPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWxDb250ZW50RU4gLS0+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7CiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6TGF5b3V0T2JqZWN0KQojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OkNvbW1vbjo6UHJvaGliaXRFbWFpbEFkZHJlc3NlcykKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwp1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UGFja2FnZTsKdXNlIERpZ2VzdDo6TUQ1IHF3KG1kNV9oZXgpOwoKdXNlIE1JTUU6OkJhc2U2NDsKdXNlIEFyY2hpdmU6OlRhcjsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0IC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3VwcG9ydCBpbmZvcm1hdGlvbiBvZiBhIHJ1bm5pbmcgT1RSUyBzeXN0ZW0uCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBTdXBwb3J0IG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFN1cHBvcnRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0RCT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1hNTE9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUaW1lT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0VtYWlsT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OkVtYWlsLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1BhY2thZ2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCmdldCBhIGhhc2ggcmVmZXJlbmNlIHdpdGggcG9zc2liaWxpdHkgY2hlY2tzLgoKICAgIG15ICRMaXN0ID0gJFN1cHBvcnQtPkFkbWluQ2hlY2tzR2V0KAogICAgICAgIEZsYXR0ZW4gPT4gMSwgIyBvcHRpb25hbCwgdG8gZmxhdHRlbiBoYXNoIHJlZnMgaW4gb3V0cHV0LCBvbmx5IG5lZWRlZCBmb3IgZ2VuZXJhdGluZyBYTUwgb3V0cHV0LgogICAgKTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdBZG1pbkNoZWNrc0dldCBzdGFydCcsCiAgICApOwoKICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvJzsKCiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoICREaXJOYW1lIC4gJy8qLnBtJyApOwoKICAgIG15ICREYXRhSGFzaDsKICAgIE1PRFVMRToKICAgIGZvciBteSAkRmlsZSAoQExpc3QpIHsKCiAgICAgICAgIyByZW1vdmUgLnBtCiAgICAgICAgJEZpbGUgPX4gcy9eLipcLyguKz8pXC5wbSQvJDEvOwogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjokRmlsZSI7CgogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CgogICAgICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGxvYWQgJEdlbmVyaWNNb2R1bGUhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgTU9EVUxFOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgIyByZXR1cm4gaWYgaW5zdGFuY2UgY2FuIG5vdCBiZSBjcmVhdGVkCiAgICAgICAgaWYgKCAhJFN1cHBvcnRPYmplY3QgKSB7CgogICAgICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiAkR2VuZXJpY01vZHVsZSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBNT0RVTEU7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhZG1pbiBjaGVjayBkYXRhCiAgICAgICAgbXkgJEFkbWluQ2hlY2tSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKCiAgICAgICAgIyBUYWJsZUluZm8gY2FuIGNvbnRhaW4gYSBoYXNoIHJlZiwgY2hlY2sgaWYgd2UgaGF2ZSB0byBmbGF0dGVuIGl0CiAgICAgICAgIyBzbyB3ZSBjYW4gcHJvdmlkZSB2YWxpZCBpbmZvIHRvIHRoZSBDaGVjayBmaWxlIGxhdGVyIG9uCgogICAgICAgIG15ICRUZXN0Q291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRDaGVjayAoQCRBZG1pbkNoZWNrUmVmKSB7CiAgICAgICAgICAgICRUZXN0Q291bnRlcisrOwogICAgICAgICAgICBpZiAoIHJlZiAkQ2hlY2stPntUYWJsZUluZm99IGVxICdIQVNIJyAmJiAkUGFyYW17RmxhdHRlbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkU3RyaW5nOwogICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICV7ICRDaGVjay0+e1RhYmxlSW5mb30gfSApIHsKICAgICAgICAgICAgICAgICAgICAkU3RyaW5nIC49ICIkSXRlbSA9ICRDaGVjay0+e1RhYmxlSW5mb30tPnskSXRlbX1cbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQWRtaW5DaGVja1JlZi0+WyAkVGVzdENvdW50ZXIgLSAxIF0tPntUYWJsZUluZm99ID0gJFN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiByZXR1cm4gdmFsdWUgaXMgYSB2YWxpZCBhcnJheSByZWZlcmVuY2UKICAgICAgICBpZiAoICEkQWRtaW5DaGVja1JlZiB8fCByZWYgJEFkbWluQ2hlY2tSZWYgbmUgJ0FSUkFZJyB8fCAhQHskQWRtaW5DaGVja1JlZn0gKSB7CgogICAgICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIGNoZWNrcyBvZiAkR2VuZXJpY01vZHVsZSByZXR1cm5lZCBubyBkYXRhISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IE1PRFVMRTsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBhbGwgdmFsaWQgZWxlbWVudHMKICAgICAgICBteSBAQ2xlYW5kQWRtaW5DaGVja1JlZiA9IGdyZXAgeyByZWYoJF8pIGVxICdIQVNIJyB9IEB7JEFkbWluQ2hlY2tSZWZ9OwoKICAgICAgICAjIGF0dGFjaCB0aGUgY2xlYW5lZCBlbGVtZW50IGFycmF5CiAgICAgICAgJERhdGFIYXNoLT57JEZpbGV9ID0gXEBDbGVhbmRBZG1pbkNoZWNrUmVmOwogICAgfQoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdBZG1pbkNoZWNrc0dldCBlbmQnLAogICAgKTsKCiAgICByZXR1cm4gJERhdGFIYXNoOwp9CgpzdWIgWE1MU3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoRGF0YUhhc2gpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggcmVmICRQYXJhbXtEYXRhSGFzaH0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRGF0YUhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ1hNTFN0cmluZ0NyZWF0ZSBzdGFydCcsCiAgICApOwoKICAgIG15ICRYTUxIYXNoICAgICA9IFtdOwogICAgbXkgJENvdW50TW9kdWxlID0gMDsKICAgIG15ICRDb3VudEl0ZW0gICA9IDA7CiAgICBNT0RVTEU6CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyAkUGFyYW17RGF0YUhhc2h9IH0gKSB7CgogICAgICAgICRDb3VudE1vZHVsZSsrOwogICAgICAgICRYTUxIYXNoLT5bMV0tPntTdXBwb3J0SW5mb30tPlsxXS0+e01vZHVsZX0tPlskQ291bnRNb2R1bGVdLT57TmFtZX0gPSAkTW9kdWxlOwoKICAgICAgICBmb3IgbXkgJERhdGFIYXNoUm93ICggQHsgJFBhcmFte0RhdGFIYXNofS0+eyRNb2R1bGV9IH0gKSB7CgogICAgICAgICAgICAkQ291bnRJdGVtKys7CiAgICAgICAgICAgIG15ICREYXRhID0ge307CgogICAgICAgICAgICBFTEVNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBzb3J0IGtleXMgJXskRGF0YUhhc2hSb3d9ICkgewoKICAgICAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAkRWxlbWVudCBlcSAnTmFtZSc7CiAgICAgICAgICAgICAgICAkRGF0YS0+eyRFbGVtZW50fS0+WzFdLT57Q29udGVudH0gPSAkRGF0YUhhc2hSb3ctPnskRWxlbWVudH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRYTUxIYXNoLT5bMV0tPntTdXBwb3J0SW5mb30tPlsxXS0+e01vZHVsZX0tPlskQ291bnRNb2R1bGVdLT57SXRlbX0tPlskQ291bnRJdGVtXSA9ICREYXRhOwoKICAgICAgICAgICAgJFhNTEhhc2gtPlsxXS0+e1N1cHBvcnRJbmZvfS0+WzFdLT57TW9kdWxlfS0+WyRDb3VudE1vZHVsZV0tPntJdGVtfS0+WyRDb3VudEl0ZW1dCiAgICAgICAgICAgICAgICAtPntOYW1lfSA9ICREYXRhSGFzaFJvdy0+e05hbWV9OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkWE1MU3RyaW5nID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoMlhNTCggQHskWE1MSGFzaH0gKTsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnWE1MU3RyaW5nQ3JlYXRlIGVuZCcsCiAgICApOwoKICAgIHJldHVybiBcJFhNTFN0cmluZzsKfQoKc3ViIExvZ0xhc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiTG9nTGFzdCAnJFBhcmFte1R5cGV9JyBzdGFydCIsCiAgICApOwoKICAgIG15ICRMb2dTdHJpbmcgPSAkU2VsZi0+e0xvZ09iamVjdH0tPkdldExvZyggTGltaXQgPT4gMTIwMCApOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJMb2dMYXN0ICckUGFyYW17VHlwZX0nIGVuZCIsCiAgICApOwoKICAgIHJldHVybiAoIFwkTG9nU3RyaW5nLCAkUGFyYW17VHlwZX0gLiAnLmxvZycgKTsKfQoKc3ViIE1vZHVsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ01vZHVsZUNoZWNrIHN0YXJ0JywKICAgICk7CgogICAgbXkgJEhvbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgbXkgJFRtcFN1bVN0cmluZzsKICAgIG15ICRUbXBMb2c7CiAgICAjIyBubyBjcml0aWMKICAgIG9wZW4oICRUbXBTdW1TdHJpbmcsICItfCIsICJwZXJsICRIb21lL2Jpbi9vdHJzLkNoZWNrTW9kdWxlcy5wbCIgKTsKICAgICMjIHVzZSBjcml0aWMKCiAgICB3aGlsZSAoPCRUbXBTdW1TdHJpbmc+KSB7CiAgICAgICAgJFRtcExvZyAuPSAkXzsKICAgIH0KICAgIGNsb3NlKCRUbXBTdW1TdHJpbmcpOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdNb2R1bGVDaGVjayBlbmQnLAogICAgKTsKCiAgICByZXR1cm4gKCBcJFRtcExvZywgJ01vZHVsZUNoZWNrLmxvZycgKTsKfQoKc3ViIEFSQ0hJVkVMb2dDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnQVJDSElWRUxvZ0NyZWF0ZSBzdGFydCcsCiAgICApOwoKICAgIG15ICRIb21lICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgIG15ICRBcmNoaXZlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvQVJDSElWRSc7CgogICAgbXkgJEhhbmRsZTsKICAgIGlmICggIW9wZW4oICRIYW5kbGUsICc8JywgJEFyY2hpdmUgKSApIHsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgbXkgJEFSQ0hJVkVFbXB0eSA9ICJDYW4ndCBvcGVuICRBcmNoaXZlOiAkISI7CgogICAgICAgICMgbG9nIGluZm8KICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdBUkNISVZFTG9nQ3JlYXRlIGVuZCcsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICggXCRBUkNISVZFRW1wdHksICdBUkNISVZFLmxvZycgKTsKICAgIH0KICAgIGJpbm1vZGUgJEhhbmRsZTsKICAgIG15ICVDb21wYXJlOwogICAgd2hpbGUgKDwkSGFuZGxlPikgewogICAgICAgIG15IEBSb3cgPSBzcGxpdCggLzo6LywgJF8gKTsKICAgICAgICBjaG9tcCAkUm93WzFdOwogICAgICAgICRDb21wYXJleyAkUm93WzFdIH0gPSAkUm93WzBdOwogICAgfQogICAgY2xvc2UgJEhhbmRsZTsKCiAgICBteSAlUmVzdWx0ID0gJFNlbGYtPl9BUkNISVZFTG9nTG9va3VwKAogICAgICAgIEluICAgICAgPT4gJEhvbWUsCiAgICAgICAgQ29tcGFyZSA9PiBcJUNvbXBhcmUsCiAgICAgICAgSG9tZSAgICA9PiAkSG9tZSwKICAgICk7CgogICAgbXkgJEFSQ0hJVkVTdHJpbmcgPSAnJzsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVSZXN1bHQgKSB7CiAgICAgICAgJEFSQ0hJVkVTdHJpbmcgLj0gIiRSZXN1bHR7JEtleX1cbiI7CiAgICB9CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0FSQ0hJVkVMb2dDcmVhdGUgZW5kJwogICAgKTsKCiAgICByZXR1cm4gKCBcJEFSQ0hJVkVTdHJpbmcsICdBUkNISVZFLmxvZycgKTsKfQoKc3ViIF9BUkNISVZFTG9nTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEhvbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwoKICAgIG15IEBMaXN0ID0gZ2xvYigiJFBhcmFte0lufS8qIik7CiAgICBGSUxFOgogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIGNsZWFuIHVwIGRpcmVjdG9yeSBuYW1lCiAgICAgICAgJEZpbGUgPX4gcy9cL1wvL1wvL2c7CgogICAgICAgICMgYWx3YXlzIHN0YXkgaW4gT1RSUyBkaXJlY3RvcnkKICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgIX4gL15cUSRIb21lXEUvOwoKICAgICAgICAjIGlnbm9yZSBjdnMgZGlyZWN0b3JpZXMKICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL0VudHJpZXN8UmVwb3NpdG9yeXxSb290fENWU3xBUkNISVZFLzsKCiAgICAgICAgIyBpZiBpdCdzIGEgZGlyZWN0b3J5CiAgICAgICAgaWYgKCAtZCAkRmlsZSApIHsKICAgICAgICAgICAgJFNlbGYtPl9BUkNISVZFTG9nTG9va3VwKAogICAgICAgICAgICAgICAgSW4gICAgICA9PiAkRmlsZSwKICAgICAgICAgICAgICAgIENvbXBhcmUgPT4gJFBhcmFte0NvbXBhcmV9LAogICAgICAgICAgICAgICAgSG9tZSAgICA9PiAkUGFyYW17SG9tZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRklMRTsKICAgICAgICB9CgogICAgICAgICMgaWdub3JlIGFsbCBub24tcmVndWxhciBmaWxlcyBhcyBsaW5rcywgcGlwZXMsIHNvY2tldHMgZXRjLgogICAgICAgIG5leHQgRklMRSBpZiAoICEtZiAkRmlsZSApOwoKICAgICAgICAjIGlmIGl0J3MgYSBmaWxlCiAgICAgICAgbXkgJE9yaWdGaWxlID0gJEZpbGU7CiAgICAgICAgJEZpbGUgPX4gcy9cUSRQYXJhbXtIb21lfVxFLy87CiAgICAgICAgJEZpbGUgPX4gcy9eXC8oLiopJC8kMS87CgogICAgICAgICMgaWdub3JlIHZhciBkaXJlY3RvcmllcwogICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvXmRvY1wvLzsKICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL152YXJcL3RtcC87CiAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9edmFyXC9hcnRpY2xlLzsKCiAgICAgICAgIyBuZXh0IGlmIG5vdCByZWFkYWJsZQogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggIW9wZW4oICRJbiwgJzwnLCAkT3JpZ0ZpbGUgKSApIHsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZWFkOiAkT3JpZ0ZpbGU6ICQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBGSUxFOwogICAgICAgIH0KICAgICAgICBteSAkQ1RYID0gRGlnZXN0OjpNRDUtPm5ldygpOwogICAgICAgICRDVFgtPmFkZGZpbGUoKiRJbik7CiAgICAgICAgbXkgJERpZ2VzdCA9ICRDVFgtPmhleGRpZ2VzdCgpOwogICAgICAgIGNsb3NlICRJbjsKICAgICAgICBpZiAoICEkUGFyYW17Q29tcGFyZX0tPnskRmlsZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSA9ICJOZXcgJEZpbGUiOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSBuZSAkRGlnZXN0ICkgewogICAgICAgICAgICAkUGFyYW17Q29tcGFyZX0tPnskRmlsZX0gPSAiRGlmICRGaWxlIjsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBkZWZpbmVkICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSApIHsKICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICV7ICRQYXJhbXtDb21wYXJlfSB9Owp9CgpzdWIgT3BtSW5mbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdPcG1JbmZvIHN0YXJ0JwogICAgKTsKCiAgICBteSAkT3BtSW5mbzsKICAgIGZvciBteSAkUGFja2FnZSAoICRTZWxmLT57UGFja2FnZU9iamVjdH0tPlJlcG9zaXRvcnlMaXN0KCkgKSB7CiAgICAgICAgJE9wbUluZm8KICAgICAgICAgICAgLj0gIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIjsKICAgICAgICAkT3BtSW5mbyAuPSAifCBOYW1lOiAgICAgICAgJFBhY2thZ2UtPntOYW1lfS0+e0NvbnRlbnR9XG4iOwogICAgICAgICRPcG1JbmZvIC49ICJ8IFZlcnNpb246ICAgICAkUGFja2FnZS0+e1ZlcnNpb259LT57Q29udGVudH1cbiI7CiAgICAgICAgJE9wbUluZm8gLj0gInwgVmVuZG9yOiAgICAgICRQYWNrYWdlLT57VmVuZG9yfS0+e0NvbnRlbnR9XG4iOwogICAgICAgICRPcG1JbmZvIC49ICJ8IFVSTDogICAgICAgICAkUGFja2FnZS0+e1VSTH0tPntDb250ZW50fVxuIjsKICAgICAgICAkT3BtSW5mbyAuPSAifCBMaWNlbnNlOiAgICAgJFBhY2thZ2UtPntMaWNlbnNlfS0+e0NvbnRlbnR9XG4iOwogICAgfQogICAgJE9wbUluZm8gLj0gIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIjsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnT3BtSW5mbyBlbmQnCiAgICApOwoKICAgIHJldHVybiAoIFwkT3BtSW5mbywgJ0luc3RhbGxlZFBhY2thZ2VzLmxvZycgKTsKfQoKc3ViIEFwcGxpY2F0aW9uQXJjaGl2ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgc3RhcnQnCiAgICApOwoKICAgIG15ICRIb21lICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgIG15ICRBcmNoaXZlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL3RtcC9hcHBsaWNhdGlvbi50YXInOwoKICAgIGlmICggLWYgJEFyY2hpdmUgKSB7CiAgICAgICAgdW5saW5rICRBcmNoaXZlIHx8IGRpZSAiQ2FuJ3QgdW5saW5rICRBcmNoaXZlOiAkISI7CiAgICB9CgogICAgbXkgQExpc3Q7CiAgICBmb3IgbXkgJExpc3RFbGVtZW50ICggJFNlbGYtPkRpcmVjdG9yeUZpbGVzKCBEaXJlY3RvcnkgPT4gJEhvbWUgKSApIHsKICAgICAgICBpZiAoIC1yICRMaXN0RWxlbWVudCApIHsKICAgICAgICAgICAgcHVzaCBATGlzdCwgJExpc3RFbGVtZW50OwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBmaWxlcyB0byB0aGUgdGFyIGFyY2hpdmUKICAgIG15ICRUYXJPYmplY3QgPSBBcmNoaXZlOjpUYXItPm5ldygpOwoKICAgICRUYXJPYmplY3QtPmFkZF9maWxlcyhATGlzdCk7CgogICAgIyBNYXNrIFBhc3N3b3JkcyBpbiBDb25maWcucG0KICAgIG15ICRIb21lV2l0aG91dFNsYXNoID0gJEhvbWU7CiAgICAkSG9tZVdpdGhvdXRTbGFzaCA9fiBzL15cLy8vOwogICAgbXkgJENvbmZpZyA9ICRUYXJPYmplY3QtPmdldF9jb250ZW50KCIkSG9tZVdpdGhvdXRTbGFzaC9LZXJuZWwvQ29uZmlnLnBtIik7CgogICAgbXkgQFRyaW1BY3Rpb24gPSBxdygKICAgICAgICBEYXRhYmFzZVB3CiAgICAgICAgU2VhcmNoVXNlclB3CiAgICAgICAgVXNlclB3CiAgICAgICAgU2VuZG1haWxNb2R1bGU6OkF1dGhQYXNzd29yZAogICAgICAgIEF1dGhNb2R1bGU6OlJhZGl1czo6UGFzc3dvcmQKICAgICAgICBQR1A6OktleTo6UGFzc3dvcmQKICAgICAgICBDdXN0b21lcjo6QXV0aE1vZHVsZTo6REI6OkN1c3RvbWVyUGFzc3dvcmQKICAgICAgICBDdXN0b21lcjo6QXV0aE1vZHVsZTo6UmFkaXVzOjpQYXNzd29yZAogICAgKTsKCiAgICBTVFJJTkc6CiAgICBmb3IgbXkgJFN0cmluZyAoQFRyaW1BY3Rpb24pIHsKICAgICAgICBuZXh0IFNUUklORyBpZiAhJFN0cmluZzsKICAgICAgICAkQ29uZmlnID1+IHMvKF5ccytcJFNlbGYuKj8kU3RyaW5nLio/PS4qPylcJy4qP1wnOy8kMVwneHh4XCc7L21nOwogICAgfQogICAgJENvbmZpZyA9fiBzLyheXHMrUGFzc3dvcmQuKj89Pi4qPylcJy4qP1wnLC8kMVwneHh4XCcsL21nOwoKICAgICRUYXJPYmplY3QtPnJlcGxhY2VfY29udGVudCggIiRIb21lV2l0aG91dFNsYXNoL0tlcm5lbC9Db25maWcucG0iLCAkQ29uZmlnICk7CiAgICBteSAkV3JpdGUgPSAkVGFyT2JqZWN0LT53cml0ZSggJEFyY2hpdmUsIDAgKTsKICAgIGlmICggISRXcml0ZSApIHsKCiAgICAgICAgIyBsb2cgaW5mbwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlIGNhbid0IHdyaXRlICRBcmNoaXZlOiAkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgZmlsZXMgdG8gdGhlIHRhciBhcmNoaXZlCiAgICBteSAkVGFyOwogICAgaWYgKCAhb3BlbiggJFRhciwgJzwnLCAkQXJjaGl2ZSApICkgeyAgICAjIyBubyBjcml0aWMKCiAgICAgICAgIyBsb2cgaW5mbwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlIGNhbid0IHJlYWQgJEFyY2hpdmU6ICQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBiaW5tb2RlICRUYXI7CiAgICBteSAkVG1wVGFyID0gZG8geyBsb2NhbCAkLzsgPCRUYXI+IH07CiAgICBjbG9zZSAkVGFyOwoKICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnQ29tcHJlc3M6OlpsaWInKSApIHsKICAgICAgICBteSAkR3pUYXIgPSBDb21wcmVzczo6WmxpYjo6bWVtR3ppcCgkVG1wVGFyKTsKCiAgICAgICAgIyBsb2cgaW5mbwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0FwcGxpY2F0aW9uQXJjaGl2ZUNyZWF0ZSBDb21wcmVzczo6WmxpYiBlbmQnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAoIFwkR3pUYXIsICdhcHBsaWNhdGlvbi50YXIuZ3onICk7CiAgICB9CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0FwcGxpY2F0aW9uQXJjaGl2ZUNyZWF0ZSBubyBDb21wcmVzczo6WmxpYiBlbmQnLAogICAgKTsKCiAgICByZXR1cm4gKCBcJFRtcFRhciwgJ2FwcGxpY2F0aW9uLnRhcicgKTsKfQoKc3ViIERpcmVjdG9yeUZpbGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoRGlyZWN0b3J5KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFydGljbGUgZGlyZWN0b3J5CiAgICBteSAkQXJ0aWNsZURpciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBcnRpY2xlRGlyJyk7CgogICAgIyBjbGVhbnVwIGZpbGUgbmFtZQogICAgJEFydGljbGVEaXIgPX4gcy9cL1wvL1wvL2c7CgogICAgIyB0ZW1wIGRpcmVjdG9yeQogICAgbXkgJFRlbXBEaXIgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGVtcERpcicpOwoKICAgICMgY2xlYW51cCBmaWxlIG5hbWUKICAgICRUZW1wRGlyID1+IHMvXC9cLy9cLy9nOwoKICAgICMgcmVzZXQgZmlsZSBjb3VudCBvbiBpbml0aWFsIGNhbGwKICAgIGlmICggISRQYXJhbXtMb29wfSApIHsKICAgICAgICAkU2VsZi0+e0RpcmVjdG9yeUZpbGVzQ291bnR9ID0gMDsKICAgIH0KCiAgICAjIGNoZWNrIGFsbCAkUGFyYW17RGlyZWN0b3J5fS8qIGluIGhvbWUgZGlyZWN0b3J5CiAgICBteSBARmlsZXM7CiAgICBteSBATGlzdCA9IGdsb2IoIiRQYXJhbXtEaXJlY3Rvcnl9LyoiKTsKICAgIEZJTEU6CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0KSB7CgogICAgICAgICMgY2xlYW51cCBmaWxlIG5hbWUKICAgICAgICAkRmlsZSA9fiBzL1wvXC8vXC8vZzsKCiAgICAgICAgIyBjaGVjayBpZiBkaXJlY3RvcnkKICAgICAgICBpZiAoIC1kICRGaWxlICkgewoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBDVlMgZGlyZWN0b3JpZXMKICAgICAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9cL0NWUy87CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGFydGljbGUgaW4gZmlsZSBzeXN0ZW0KICAgICAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9cUSRBcnRpY2xlRGlyXEUvaTsKCiAgICAgICAgICAgICMgZG8gbm90IGluY2x1ZGUgdG1wIGluIGZpbGUgc3lzdGVtCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvXFEkVGVtcERpclxFL2k7CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGpzLWNhY2hlCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvanMtY2FjaGUvOwoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBjc3MtY2FjaGUKICAgICAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9jc3MtY2FjaGUvOwoKICAgICAgICAgICAgIyBhZGQgZGlyZWN0b3J5IHRvIGxpc3QKICAgICAgICAgICAgcHVzaCBARmlsZXMsCiAgICAgICAgICAgICAgICAkU2VsZi0+RGlyZWN0b3J5RmlsZXMoCiAgICAgICAgICAgICAgICBEaXJlY3RvcnkgPT4gJEZpbGUsCiAgICAgICAgICAgICAgICBMb29wICAgICAgPT4gMQogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGhpZGRlbiBmaWxlcwogICAgICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL15cLi87CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGZpbGVzIHdpdGggIyBpbiBmaWxlIG5hbWUKICAgICAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC8jLzsKCiAgICAgICAgICAgICMgZG8gbm90IGluY2x1ZGUgaWYgZmlsZSBpcyBiaWdnZXIgdGhlIDAuNDUgTUIKICAgICAgICAgICAgbmV4dCBGSUxFIGlmICggLXMgJEZpbGUgPiAoIDEwMjQgKiAxMDI0ICogMC40NSApICk7CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGlmIGZpbGUgaXMgbm90IHJlYWRhYmxlCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAhLXIgJEZpbGU7CgogICAgICAgICAgICAjIGFkZCBmaWxlIHRvIGxpc3QKICAgICAgICAgICAgcHVzaCBARmlsZXMsICRGaWxlOwoKICAgICAgICAgICAgIyBjaGVjayB0b3RhbCBjb3VudCBvZiBmaWxlcyAobWF4LiBmaWxlIGNvdW50KQogICAgICAgICAgICBteSAkRmlsZUNvdW50TWF4ID0gOF8wMDA7CiAgICAgICAgICAgICRTZWxmLT57RGlyZWN0b3J5RmlsZXNDb3VudH0rKzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RpcmVjdG9yeUZpbGVzQ291bnR9ID4gJEZpbGVDb3VudE1heCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk1heCBmaWxlIGNvdW50ICgkRmlsZUNvdW50TWF4KSBmb3IgYXBwbGljYXRpb24gYXJjaGl2ZSByZWFjaGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIEBGaWxlczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQEZpbGVzOwp9CgpzdWIgR2V0SW5zdGFsbGVkUHJvZHVjdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdHZXRJbnN0YWxsZWRQcm9kdWN0IHN0YXJ0JywKICAgICk7CgogICAgbXkgJFByb2R1Y3Q7CiAgICBteSAlVG9vbCA9ICgKICAgICAgICBTSVJJT1MgICAgICAgICAgICAgICA9PiAwLAogICAgICAgIElUU00gICAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgV0lEQXV0aG9yaW5nICAgICAgICAgPT4gMCwKICAgICAgICBXSURQdWJsaWNhdGlvblN5c3RlbSA9PiAwLAogICAgKTsKCiAgICAkUHJvZHVjdCA9ICJQcm9kdWN0OiAiIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Byb2R1Y3QnKSAuICcgJwogICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1ZlcnNpb24nKTsKCiAgICBmb3IgbXkgJFBhY2thZ2UgKCAkU2VsZi0+e1BhY2thZ2VPYmplY3R9LT5SZXBvc2l0b3J5TGlzdCgpICkgewogICAgICAgIGZvciBteSAkVG9vbHMgKCBzb3J0IGtleXMgJVRvb2wgKSB7CiAgICAgICAgICAgIGlmICggJFRvb2xzID1+IC9eXFEkUGFja2FnZS0+e05hbWV9LT57Q29udGVudH1cRSQvICkgewogICAgICAgICAgICAgICAgaWYgKCAkVG9vbHskVG9vbHN9ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJFByb2R1Y3QgLj0gIiAvICRQYWNrYWdlLT57TmFtZX0tPntDb250ZW50fSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkVG9vbHskVG9vbHN9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCB0aGUgcHJvZHVjdCBuYW1lICh3aGljaCBjb250YWlucyB0aGUgSVRTTSB2ZXJzaW9uLCBpZiBJVFNNIGlzIGluc3RhbGxlZCkKICAgICRQcm9kdWN0IC49ICcgLyAnIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Byb2R1Y3ROYW1lJyk7CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0dldEluc3RhbGxlZFByb2R1Y3QgZW5kJywKICAgICk7CgogICAgcmV0dXJuICRQcm9kdWN0Owp9CgpzdWIgU2VuZEluZm8gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnU2VuZEluZm8gc3RhcnQnLAogICAgKTsKCiAgICAjIGNyZWF0ZSBsb2cgcGFja2FnZQogICAgbXkgKCAkTG9nUHJlQ29udGVudCwgJExvZ1ByZUZpbGVuYW1lICkgPSAkU2VsZi0+TG9nTGFzdCggVHlwZSA9PiAnbG9nX3ByZScgKTsKCiAgICAjIGNyZWF0ZSBjaGVjayBwYWNrYWdlCiAgICBteSAkRGF0YUhhc2ggPSAkU2VsZi0+QWRtaW5DaGVja3NHZXQoCiAgICAgICAgRmxhdHRlbiA9PiAxLAogICAgKTsKICAgIG15ICRYTUxDaGVjayA9ICRTZWxmLT5YTUxTdHJpbmdDcmVhdGUoIERhdGFIYXNoID0+ICREYXRhSGFzaCApOwoKICAgICMgY3JlYXRlIGFwcGxpY2F0aW9uIHBhY2thZ2UKICAgIG15ICggJENvbnRlbnQsICRGaWxlbmFtZSApID0gJFNlbGYtPkFwcGxpY2F0aW9uQXJjaGl2ZUNyZWF0ZSgpOwoKICAgICMgY3JlYXRlIEFSQ0hJVkUgbG9nIHBhY2thZ2UKICAgIG15ICggJEFSQ0hJVkVDb250ZW50LCAkQVJDSElWRUZpbGVuYW1lICkgPSAkU2VsZi0+QVJDSElWRUxvZ0NyZWF0ZSgpOwoKICAgICMgY3JlYXRlIE9QTSBJbmZvIHBhY2thZ2UgbGlrZSAuL29wbS5wbCAtYSBsaXN0CiAgICBteSAoICRPUE1JbmZvQ29udGVudCwgJE9QTUluZm9GaWxlbmFtZSApID0gJFNlbGYtPk9wbUluZm8oKTsKCiAgICAjIGNyZWF0ZSBtb2R1bGUgY2hlY2sgcGFja2FnZQogICAgbXkgKCAkTW9kdWxlQ2hlY2tDb250ZW50LCAkTW9kdWxlQ2hlY2tGaWxlbmFtZSApID0gJFNlbGYtPk1vZHVsZUNoZWNrKCk7CgogICAgIyBjcmVhdGUgbG9nIHBhY2thZ2UKICAgIG15ICggJExvZ1Bvc3RDb250ZW50LCAkTG9nUG9zdEZpbGVuYW1lICkgPSAkU2VsZi0+TG9nTGFzdCggVHlwZSA9PiAnbG9nX3Bvc3QnICk7CgogICAgIyBjcmVhdGUgbWFpbCBib2R5CiAgICBteSAkQm9keSA9ICcnOwogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0N1c3RvbWVySW5mb30gfSApIHsKICAgICAgICBteSAkSXRlbVZhbHVlID0gJFBhcmFte0N1c3RvbWVySW5mb30tPnskS2V5fSB8fCAnJzsKICAgICAgICBpZiAoICRLZXkgZXEgJ1NlbmRJbmZvJyAmJiAkSXRlbVZhbHVlICkgewogICAgICAgICAgICAkSXRlbVZhbHVlID0gJ1llcyc7CiAgICAgICAgfQogICAgICAgICRCb2R5IC49ICIkS2V5OiRJdGVtVmFsdWVcbiI7CiAgICB9CgogICAgIyBHZXQgdGhlIEZRRE4KICAgIG15ICRGUUROID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZRRE4nKSB8fCAnJzsKICAgICRCb2R5IC49ICJGUUROOiIgLiAkRlFETiAuICJcbiI7CgogICAgIyBHZXQgdGhlIG90cnMgdmVyc2lvbiBhbmQgaWYgaW5zdGFsbGVkIGFkZCBvdGhlciBwcm9kdWN0IGluZm8gbGlrZSBTSVJJT1Mgb3IgSVRTTS4KICAgICRCb2R5IC49ICRTZWxmLT5HZXRJbnN0YWxsZWRQcm9kdWN0KCk7CgogICAgbXkgJFNlbmQgPSAkU2VsZi0+e0VtYWlsT2JqZWN0fS0+U2VuZCgKICAgICAgICBGcm9tICAgICAgID0+ICRQYXJhbXtDdXN0b21lckluZm99LT57U2VuZGVyfSwKICAgICAgICBUbyAgICAgICAgID0+ICdzdXBwb3J0QG90cnMuY29tJywKICAgICAgICBTdWJqZWN0ICAgID0+ICdTdXBwb3J0OjpSZXF1ZXN0OjpBdXRvOjpFbWFpbDo6Q0hFQ0snLAogICAgICAgIFR5cGUgICAgICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgIENoYXJzZXQgICAgPT4gJ3V0Zi04JywKICAgICAgICBCb2R5ICAgICAgID0+ICRCb2R5LAogICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkTG9nUHJlRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRMb2dQcmVDb250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2NoZWNrLnhtbCcsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRYTUxDaGVja30sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC94bWwnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRDb250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkQVJDSElWRUZpbGVuYW1lLAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJHskQVJDSElWRUNvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkTW9kdWxlQ2hlY2tGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JE1vZHVsZUNoZWNrQ29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRPUE1JbmZvRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRPUE1JbmZvQ29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRMb2dQb3N0RmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRMb2dQb3N0Q29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ1NlbmRJbmZvIGVuZCcsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgRG93bmxvYWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnRG93bmxvYWQgc3RhcnQnLAogICAgKTsKCiAgICAjIyBubyBjcml0aWMKICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSwgJHdkLCAkeWQsICRkc3QgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CiAgICAjIyB1c2UgY3JpdGljCiAgICBteSAkRmlsZW5hbWUgPSAiU3VwcG9ydEluZm9fJFktJE0tJEQiIC4gJ18nIC4gIiRoLSRtIjsKCiAgICAjIGNyZWF0ZSBsb2cgcGFja2FnZQogICAgbXkgJUZpbGU7CiAgICAoICRGaWxle0xvZ1ByZUNvbnRlbnR9LCAkRmlsZXtMb2dQcmVGaWxlbmFtZX0gKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcHJlJyApOwoKICAgICMgY3JlYXRlIGNoZWNrIHBhY2thZ2UKICAgIG15ICREYXRhSGFzaCA9ICRTZWxmLT5BZG1pbkNoZWNrc0dldCgKICAgICAgICBGbGF0dGVuID0+IDEsCiAgICApOwoKICAgICRGaWxle0NoZWNrQ29udGVudH0gPSAkU2VsZi0+WE1MU3RyaW5nQ3JlYXRlKAogICAgICAgIERhdGFIYXNoID0+ICREYXRhSGFzaCwKICAgICk7CiAgICAkRmlsZXtDaGVja0ZpbGVuYW1lfSA9ICdjaGVjay54bWwnOwoKICAgICMgY3JlYXRlIGFwcGxpY2F0aW9uIHBhY2thZ2UKICAgICggJEZpbGV7QXBwQ29udGVudH0sICRGaWxle0FwcEZpbGVuYW1lfSApID0gJFNlbGYtPkFwcGxpY2F0aW9uQXJjaGl2ZUNyZWF0ZSgpOwoKICAgICMgY3JlYXRlIEFSQ0hJVkUgbG9nIHBhY2thZ2UKICAgICggJEZpbGV7QXJjaENvbnRlbnR9LCAkRmlsZXtBcmNoRmlsZW5hbWV9ICkgPSAkU2VsZi0+QVJDSElWRUxvZ0NyZWF0ZSgpOwoKICAgICMgY3JlYXRlIE9QTSBJbmZvIHBhY2thZ2UgbGlrZSAuL29wbS5wbCAtYSBsaXN0CiAgICAoICRGaWxle09QTUluZm9Db250ZW50fSwgJEZpbGV7T1BNSW5mb0ZpbGVuYW1lfSApID0gJFNlbGYtPk9wbUluZm8oKTsKCiAgICAjIGNyZWF0ZSBtb2R1bGUgY2hlY2sgcGFja2FnZQogICAgKCAkRmlsZXtNb2R1bGVDaGVja0NvbnRlbnR9LCAkRmlsZXtNb2R1bGVDaGVja0ZpbGVuYW1lfSApID0gJFNlbGYtPk1vZHVsZUNoZWNrKCk7CgogICAgIyBjcmVhdGUgbG9nIHBhY2thZ2UKICAgICggJEZpbGV7TG9nUG9zdENvbnRlbnR9LCAkRmlsZXtMb2dQb3N0RmlsZW5hbWV9ICkgPSAkU2VsZi0+TG9nTGFzdCggVHlwZSA9PiAnbG9nX3Bvc3QnICk7CgogICAgIyBjcmVhdGUgbWFpbCBib2R5CiAgICBteSAkQm9keSA9ICcnOwogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVBhcmFtICkgewogICAgICAgICRCb2R5IC49ICIkS2V5OiRQYXJhbXskS2V5fVxuIjsKICAgIH0KICAgICRCb2R5IC49ICJGUUROOiIgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpIC4gIlxuIjsKICAgICRCb2R5IC49ICRTZWxmLT5HZXRJbnN0YWxsZWRQcm9kdWN0KCk7CgogICAgJEZpbGV7Qm9keUNvbnRlbnR9ICA9IFwkQm9keTsKICAgICRGaWxle0JvZHlGaWxlbmFtZX0gPSAnQm9keS50eHQnOwoKICAgICMgc2F2ZSBhbmQgY3JlYXRlIGFyY2hpdmUKICAgIG15ICRUZW1wRGlyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKSAuICcvc3VwcG9ydGluZm8vJzsKCiAgICBpZiAoICEtZCAkVGVtcERpciApIHsKICAgICAgICBta2RpciAkVGVtcERpcjsKICAgIH0KCiAgICAjIHJlbW92ZSBhbGwgZmlsZXMKICAgIG15IEBMaXN0T2xkID0gZ2xvYiggJFRlbXBEaXIgLiAnLyonICk7CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0T2xkKSB7CiAgICAgICAgdW5saW5rICRGaWxlOwogICAgfQoKICAgIG15IEBMaXN0OwogICAgZm9yIG15ICRLZXkgKHF3KEJvZHkgTG9nUHJlIENoZWNrIEFwcCBBcmNoIE1vZHVsZUNoZWNrIExvZ1Bvc3QgT1BNSW5mbykpIHsKICAgICAgICBpZiAoICRGaWxleyAkS2V5IC4gJ0ZpbGVuYW1lJyB9ICYmICRGaWxleyAkS2V5IC4gJ0NvbnRlbnQnIH0gKSB7CiAgICAgICAgICAgIG15ICRGaWxlbmFtZSA9ICRUZW1wRGlyIC4gJy8nIC4gJEZpbGV7ICRLZXkgLiAnRmlsZW5hbWUnIH07CiAgICAgICAgICAgIG9wZW4oIG15ICRPdXQsICc+JywgJEZpbGVuYW1lICk7ICAgICMjIG5vIGNyaXRpYwogICAgICAgICAgICBiaW5tb2RlKCRPdXQpOwogICAgICAgICAgICBwcmludCAkT3V0ICR7ICRGaWxleyAkS2V5IC4gJ0NvbnRlbnQnIH0gfTsKICAgICAgICAgICAgY2xvc2UgJE91dDsKICAgICAgICAgICAgcHVzaCBATGlzdCwgJEZpbGVuYW1lOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBmaWxlcyB0byB0aGUgdGFyIGFyY2hpdmUKICAgIG15ICRBcmNoaXZlICAgPSAkVGVtcERpciAuICcvJyAuICRGaWxlbmFtZTsKICAgIG15ICRUYXJPYmplY3QgPSBBcmNoaXZlOjpUYXItPm5ldygpOwogICAgJFRhck9iamVjdC0+YWRkX2ZpbGVzKEBMaXN0KTsKICAgICRUYXJPYmplY3QtPndyaXRlKCAkQXJjaGl2ZSwgMCApIHx8IGRpZSAiQ291bGQgbm90IHdyaXRlOiAkXyEiOwoKICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgb3BlbiggbXkgJFRhciwgJzwnLCAkQXJjaGl2ZSApOyAgICAjIyBubyBjcml0aWMKICAgIGJpbm1vZGUgJFRhcjsKICAgIG15ICRUbXBUYXIgPSBkbyB7IGxvY2FsICQvOyA8JFRhcj4gfTsKICAgIGNsb3NlICRUYXI7CgogICAgIyByZW1vdmUgYWxsIGZpbGVzCiAgICBATGlzdE9sZCA9IGdsb2IoICRUZW1wRGlyIC4gJy8qJyApOwogICAgZm9yIG15ICRGaWxlIChATGlzdE9sZCkgewogICAgICAgIHVubGluayAkRmlsZTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ0NvbXByZXNzOjpabGliJykgKSB7CiAgICAgICAgbXkgJEd6VGFyID0gQ29tcHJlc3M6OlpsaWI6Om1lbUd6aXAoJFRtcFRhcik7CgogICAgICAgICMgbG9nIGluZm8KICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdEb3dubG9hZCBDb21wcmVzczo6WmxpYiBlbmQnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAoIFwkR3pUYXIsICRGaWxlbmFtZSAuICcudGFyLmd6JyApOwogICAgfQoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdEb3dubG9hZCBubyBDb21wcmVzczo6WmxpYiBlbmQnLAogICAgKTsKCiAgICByZXR1cm4gKCBcJFRtcFRhciwgJEZpbGVuYW1lIC4gJy50YXInICk7Cn0KCnN1YiBCZW5jaG1hcmsgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTW9kZSA9ICRQYXJhbXtNb2RlfTsKCiAgICBmb3IgKCAxIC4uICRNb2RlICkgewogICAgICAgICRTZWxmLT57IkRCT2JqZWN0JF8ifSA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCAleyRTZWxmfSApOwogICAgfQoKICAgICRQYXJhbXtJbnNlcnRUaW1lfSA9IDA7CiAgICAkUGFyYW17VXBkYXRlVGltZX0gPSAwOwogICAgJFBhcmFte1NlbGVjdFRpbWV9ID0gMDsKICAgICRQYXJhbXtEZWxldGVUaW1lfSA9IDA7CgogICAgbXkgJFRpbWVTdGFydCA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKCiAgICAkU2VsZi0+X1NRTEluc2VydCggTW9kZSA9PiAkTW9kZSApOwogICAgbXkgJFRpbWUxID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwoKICAgICRTZWxmLT5fU1FMVXBkYXRlKCBNb2RlID0+ICRNb2RlICk7CiAgICBteSAkVGltZTIgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CgogICAgJFNlbGYtPl9TUUxTZWxlY3QoIE1vZGUgPT4gJE1vZGUgKTsKICAgIG15ICRUaW1lMyA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKCiAgICAkU2VsZi0+X1NRTERlbGV0ZSggTW9kZSA9PiAkTW9kZSApOwogICAgbXkgJFRpbWU0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwoKICAgICRQYXJhbXtJbnNlcnRUaW1lfSA9ICRQYXJhbXtJbnNlcnRUaW1lfSArICRUaW1lMSAtICRUaW1lU3RhcnQ7CiAgICAkUGFyYW17VXBkYXRlVGltZX0gPSAkUGFyYW17VXBkYXRlVGltZX0gKyAkVGltZTIgLSAkVGltZTE7CiAgICAkUGFyYW17U2VsZWN0VGltZX0gPSAkUGFyYW17U2VsZWN0VGltZX0gKyAkVGltZTMgLSAkVGltZTI7CiAgICAkUGFyYW17RGVsZXRlVGltZX0gPSAkUGFyYW17RGVsZXRlVGltZX0gKyAkVGltZTQgLSAkVGltZTM7CgogICAgbXkgJEluc2VydFRpbWUgPSAkUGFyYW17SW5zZXJ0VGltZX0gLyAkTW9kZTsKICAgIGlmICggJEluc2VydFRpbWUgPD0gMyApIHsKICAgICAgICAkUGFyYW17SW5zZXJ0UmVzdWx0fSA9ICdGaW5lJzsKICAgIH0KICAgIGVsc2lmICggJEluc2VydFRpbWUgPD0gNSApIHsKICAgICAgICAkUGFyYW17SW5zZXJ0UmVzdWx0fSA9ICdPSyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17SW5zZXJ0UmVzdWx0fSAgICAgPSAnV3JvbmcnOwogICAgICAgICRQYXJhbXtJbnNlcnRTaG91bGRUYWtlfSA9IGludCggJE1vZGUgKiA1ICk7CiAgICB9CgogICAgbXkgJFVwZGF0ZVRpbWUgPSAkUGFyYW17VXBkYXRlVGltZX0gLyAkTW9kZTsKICAgIGlmICggJFVwZGF0ZVRpbWUgPD0gNSApIHsKICAgICAgICAkUGFyYW17VXBkYXRlUmVzdWx0fSA9ICdGaW5lJzsKICAgIH0KICAgIGVsc2lmICggJFVwZGF0ZVRpbWUgPD0gOSApIHsKICAgICAgICAkUGFyYW17VXBkYXRlUmVzdWx0fSA9ICdPSyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17VXBkYXRlUmVzdWx0fSAgICAgPSAnV3JvbmcnOwogICAgICAgICRQYXJhbXtVcGRhdGVTaG91bGRUYWtlfSA9IGludCggJE1vZGUgKiA5ICk7CiAgICB9CgogICAgbXkgJFNlbGVjdFRpbWUgPSAkUGFyYW17U2VsZWN0VGltZX0gLyAkTW9kZTsKICAgIGlmICggJFNlbGVjdFRpbWUgPD0gNSApIHsKICAgICAgICAkUGFyYW17U2VsZWN0UmVzdWx0fSA9ICdGaW5lJzsKICAgIH0KICAgIGVsc2lmICggJFNlbGVjdFRpbWUgPD0gNiApIHsKICAgICAgICAkUGFyYW17U2VsZWN0UmVzdWx0fSA9ICdPSyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17U2VsZWN0UmVzdWx0fSAgICAgPSAnV3JvbmcnOwogICAgICAgICRQYXJhbXtTZWxlY3RTaG91bGRUYWtlfSA9IGludCggJE1vZGUgKiA2ICk7CiAgICB9CgogICAgbXkgJERlbGV0ZVRpbWUgPSAkUGFyYW17RGVsZXRlVGltZX0gLyAkTW9kZTsKICAgIGlmICggJERlbGV0ZVRpbWUgPD0gNCApIHsKICAgICAgICAkUGFyYW17RGVsZXRlUmVzdWx0fSA9ICdGaW5lJzsKICAgIH0KICAgIGVsc2lmICggJERlbGV0ZVRpbWUgPD0gNSApIHsKICAgICAgICAkUGFyYW17RGVsZXRlUmVzdWx0fSA9ICdPSyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17RGVsZXRlUmVzdWx0fSAgICAgPSAnV3JvbmcnOwogICAgICAgICRQYXJhbXtEZWxldGVTaG91bGRUYWtlfSA9IGludCggJE1vZGUgKiA1ICk7CiAgICB9CgogICAgIyByZW1vdmUgYWxsIHJvd3MgaW4gdGhlIGJlbmNoIHRlc3QgdGFibGUKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIHN1cHBvcnRfYmVuY2hfdGVzdCcsCiAgICApOwoKICAgIHJldHVybiAlUGFyYW07Cn0KCnN1YiBfU1FMSW5zZXJ0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTBfMDAwICkgewoKICAgICAgICBmb3IgbXkgJE1vZGUgKCAxIC4uICRQYXJhbXtNb2RlfSApIHsKCiAgICAgICAgICAgIG15ICRWYWx1ZTEgPSAiYWFhJENvdW50LSRNb2RlIjsKICAgICAgICAgICAgbXkgJFZhbHVlMiA9IGludCByYW5kIDEwMDAwMDA7CgogICAgICAgICAgICAjIGluc2VydCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57IkRCT2JqZWN0JE1vZGUifS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICdJTlNFUlQgSU5UTyBzdXBwb3J0X2JlbmNoX3Rlc3QgKG5hbWVfYSwgbmFtZV9iKSB2YWx1ZXMgKD8sID8pJywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFZhbHVlMSwgXCRWYWx1ZTIsIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfU1FMVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTBfMDAwICkgewoKICAgICAgICBmb3IgbXkgJE1vZGUgKCAxIC4uICRQYXJhbXtNb2RlfSApIHsKCiAgICAgICAgICAgIG15ICRWYWx1ZU9sZCA9ICJhYWEkQ291bnQtJE1vZGUiOwogICAgICAgICAgICBteSAkVmFsdWUxICAgPSAiYmJiJENvdW50LSRNb2RlIjsKICAgICAgICAgICAgbXkgJFZhbHVlMiAgID0gaW50IHJhbmQgMTAwMDAwMDsKCiAgICAgICAgICAgICMgdXBkYXRlIGRhdGEKICAgICAgICAgICAgJFNlbGYtPnsiREJPYmplY3QkTW9kZSJ9LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gJ1VQREFURSBzdXBwb3J0X2JlbmNoX3Rlc3QgU0VUIG5hbWVfYSA9ID8sIG5hbWVfYiA9ID8gV0hFUkUgbmFtZV9hID0gPycsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRWYWx1ZTEsIFwkVmFsdWUyLCBcJFZhbHVlT2xkIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1NRTFNlbGVjdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDEwXzAwMCApIHsKCiAgICAgICAgZm9yIG15ICRNb2RlICggMSAuLiAkUGFyYW17TW9kZX0gKSB7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAiYmJiJENvdW50LSRNb2RlIjsKCiAgICAgICAgICAgICMgc2VsZWN0IHRoZSBkYXRhCiAgICAgICAgICAgICRTZWxmLT57IkRCT2JqZWN0JE1vZGUifS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCAgPT4gIlNFTEVDVCBuYW1lX2EsIG5hbWVfYiBGUk9NIHN1cHBvcnRfYmVuY2hfdGVzdCBXSEVSRSBuYW1lX2EgPSA/IiwKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFZhbHVlIF0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZldGNoIHRoZSBkYXRhCiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57IkRCT2JqZWN0JE1vZGUifS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgICAgICMgZG8gbm90aGluZwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1NRTERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDEwXzAwMCApIHsKCiAgICAgICAgZm9yIG15ICRNb2RlICggMSAuLiAkUGFyYW17TW9kZX0gKSB7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAiYmJiJENvdW50LSRNb2RlIjsKCiAgICAgICAgICAgICMgZGVsZXRlIGRhdGEKICAgICAgICAgICAgJFNlbGYtPnsiREJPYmplY3QkTW9kZSJ9LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHN1cHBvcnRfYmVuY2hfdGVzdCBXSEVSRSBuYW1lX2EgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFZhbHVlIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OkxheW91dE9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZSAtIGdsb2JhbCBzeXN0ZW0gaW5mb3JtYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbiB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgRGF0YWJhc2UgaW5mbyBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBEQk9iamVjdCBFbmNvZGVPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJERhdGFiYXNlQXJyYXkgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwoKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGFBcnJheSA9IFtdOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCBkYXRhYmFzZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKICAgICMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKCk7CiAgICAjICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdXNlZCBkYXRhYmFzZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIHRpY2tldCBkYXRhYmFzZSBpcyBjb25maWd1cmVkCiAgICBteSAkRGF0YWJhc2VUeXBlID0gJFNlbGYtPntEQk9iamVjdH0tPnsnREI6OlR5cGUnfTsKCiAgICAjIHRyeSB0byBnZXQgYXZhaWxhYmxlIG1vZHVsZXMgYW5kIHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gIi9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvRGF0YWJhc2UiOwoKICAgICMgcmVhZCBhbGwgYXZhaWxhYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYiggJERpck5hbWUgLiAiLyoucG0iICk7CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0KSB7CgogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBpZiAoICREYXRhYmFzZVR5cGUgPX4gL09EQkMvaSApIHsKICAgICAgICAgICAgJERhdGFiYXNlVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEYXRhYmFzZTo6VHlwZScpOwogICAgICAgIH0KICAgICAgICBpZiAoICREYXRhYmFzZVR5cGUgPX4gL14kRmlsZS9pICkgewogICAgICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U6OiRGaWxlIjsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCAleyRTZWxmfSApOwogICAgICAgICAgICAgICAgaWYgKCRTdXBwb3J0T2JqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFycmF5UmVmID0gJFN1cHBvcnRPYmplY3QtPkFkbWluQ2hlY2tzR2V0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQXJyYXlSZWYgJiYgcmVmKCRBcnJheVJlZikgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCggQHskRGF0YUFycmF5fSwgQHskQXJyYXlSZWZ9ICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9TOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OkxheW91dE9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RW52aXJvbm1lbnQ7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhNYWluT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgRW5jb2RlT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9ICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9OwogICAgJFNlbGYtPntFbnZpcm9ubWVudE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW52aXJvbm1lbnQtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5hbWVzIG9mIGF2YWlsYWJsZSBjaGVja3MgZnJvbSBzeXNjb25maWcKICAgIG15ICRDaGVja3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6T1MnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gc29ydCBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9EaXN0cmlidXRpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVPU0luZm8gPSAkU2VsZi0+e0Vudmlyb25tZW50T2JqZWN0fS0+T1NJbmZvR2V0KCk7CgogICAgIyBpZiBPU25hbWUgc3RhcnRzIHdpdGggVW5rbm93biwgdGVzdCB3YXMgbm90IHN1Y2Nlc3NmdWwKICAgIG15ICRSZXN1bHQgPSAkT1NJbmZve09TTmFtZX0gPX4gL1xBIFVua25vd24gL3htcyA/ICdGYWlsZWQnIDogJ09LJzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdEaXN0cmlidXRpb24nKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTaG93cyB0aGUgdXNlZCBkaXN0cmlidXRpb24uJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE9TSW5mb3tPU05hbWV9LAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICB9OwoKICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9LZXJuZWxJbmZvQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCAkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSApIHsKICAgICAgICBteSAkVG1wTGluZSA9ICIiOwogICAgICAgIG15ICRLZXJuZWxJbmZvOwogICAgICAgIGlmICggb3BlbiggJEtlcm5lbEluZm8sICItfCIsICJ1bmFtZSAtYSIgKSApIHsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgIHdoaWxlICg8JEtlcm5lbEluZm8+KSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkS2VybmVsSW5mbyk7CiAgICAgICAgICAgIGlmICgkVG1wTGluZSkgewogICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9ccyskLy9nOwogICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnS2VybmVsIFZlcnNpb24nKSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTaG93cyB0aGUgdXNlZCBLZXJuZWwgdmVyc2lvbi4nKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAiXCIkVG1wTGluZVwiICIgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdpcyB1c2VkLicpLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0tlcm5lbCBWZXJzaW9uJyksCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTaG93cyB0aGUgdXNlZCBLZXJuZWwgdmVyc2lvbi4nKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIkNhblwndCBleGVjdXRlIHVuYW1lIC1hLi4uIiksCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAnQ3JpdGljYWwnLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJF5PID1+IC93aW4zMi9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9QZXJsQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgY2hlY2sgdmVyaXNvbiBzdHJpbmcKICAgIG15ICRWZXJzaW9uID0gc3ByaW50ZiAiJXZkIiwgJF5WOwogICAgbXkgJE9TICAgICAgPSBzcHJpbnRmICIkXk8iLCAkXlY7CiAgICBteSAkQnVpbGQgICA9ICcnOwoKICAgICMgQWN0aXZlUGVybCBkZXRlY3Rpb24KICAgIGlmICggJF5PID1+IC93aW4zMi9pICkgewogICAgICAgICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ1dpbjMyJyk7CgogICAgICAgICMgV2luMzI6OkJ1aWxkTnVtYmVyKCkgaXMgb25seSBhdmFpbGFibGUgb24gQWN0aXZlUGVybCwgTk9UIG9uIFN0cmF3YmVycnkuCiAgICAgICAgbm8gc3RyaWN0ICdyZWZzJzsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgaWYgKCBkZWZpbmVkICZXaW4zMjo6QnVpbGROdW1iZXIgKSB7CiAgICAgICAgICAgICRCdWlsZCA9ICcgKEFjdGl2ZVN0YXRlIGJ1aWxkICcgLiBXaW4zMjo6QnVpbGROdW1iZXIoKSAuICcpJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRCdWlsZCA9ICcgKFN0cmF3YmVycnlQZXJsKSc7CiAgICAgICAgfQogICAgICAgIHVzZSBzdHJpY3Q7CiAgICB9CgogICAgaWYgKCAkVmVyc2lvbiA9fiAvKFxkKylcLihcZCspXC4oXGQrKS9pICkgewogICAgICAgIGlmICggJDEgPD0gNSAmJiAkMiA8PSA4ICYmICQzIDw9IDcgKSB7CiAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGVybENoZWNrJyksCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBQZXJsIHZlcnNpb24uJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91ciBQZXJsJykgLiAiICRWZXJzaW9uJEJ1aWxkICgkT1MpIiAuCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnaXMgdG9vIG9sZCwgeW91IHNob3VsZCB1cGdyYWRlIHRvIFBlcmwgNS44Ljggb3IgaGlnaGVyLicpLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ0ZhaWxlZCcsCiAgICAgICAgICAgIH07CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQZXJsQ2hlY2snKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIFBlcmwgdmVyc2lvbi4nKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJQZXJsICRWZXJzaW9uJEJ1aWxkICgkT1MpICIgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdpcyB1c2VkLicpLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGVybENoZWNrJyksCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIFBlcmwgdmVyc2lvbi4nKSwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVW5hYmxlIHRvIHBhcnNlIHZlcnNpb24gc3RyaW5nJykKICAgICAgICAgICAgICAgIC4gIiAoJFZlcnNpb24kQnVpbGQgLyAkT1MpLiIsCiAgICAgICAgICAgIENoZWNrID0+ICdDcml0aWNhbCcsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBfUGVybE1vZHVsZXNDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICBteSAkSG9tZSAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBteSAkVG1wU3VtU3RyaW5nOwoKICAgIG15ICRPdXRwdXQ7CiAgICAjIyBubyBjcml0aWMKICAgIG9wZW4oIG15ICRGSCwgIi18IiwgInBlcmwgJEhvbWUvYmluL290cnMuQ2hlY2tNb2R1bGVzLnBsIG5vY29sb3JzIC0tYWxsIiApOwogICAgIyMgdXNlIGNyaXRpYwoKICAgIHdoaWxlICg8JEZIPikgewogICAgICAgICRPdXRwdXQgLj0gJF87CiAgICB9CiAgICBjbG9zZSgkRkgpOwoKICAgIGlmICgKICAgICAgICAkT3V0cHV0ID1+IG17Tm90IFxzIGluc3RhbGxlZCEgXHMgXChSZXF1aXJlZH1zbXgKICAgICAgICB8fCAkT3V0cHV0ID1+IG17ZmFpbGVkIX1zbXgKICAgICAgICApCiAgICB7CiAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BlcmxNb2R1bGVzQ2hlY2snKSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgUGVybCBNb2R1bGVzIGluc3RhbGxlZC4nKSwKICAgICAgICAgICAgQ29tbWVudCA9PgogICAgICAgICAgICAgICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICdUaGVyZSBpcyBhbiBlcnJvciBpbiB5b3VyIGluc3RhbGxlZCBwZXJsIG1vZHVsZXMgY29uZmlndXJhdGlvbi4gUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgLAogICAgICAgICAgICBDaGVjayAgICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgICAgICBCbG9ja1N0eWxlICAgID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgIENvbnRlbnRTdHJpbmcgPT4gJE91dHB1dCwKICAgICAgICB9OwoKICAgIH0KICAgIGVsc2UgewogICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BlcmxNb2R1bGVzQ2hlY2snKSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBQZXJsIE1vZHVsZXMgaW5zdGFsbGVkLicpLAogICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0FsbCBQZXJsIG1vZHVsZXMgbmVlZGVkIGFyZSBjdXJyZW50bHkgaW5zdGFsbGVkLicpLAogICAgICAgICAgICBDaGVjayAgICAgICAgID0+ICdPSycsCiAgICAgICAgICAgIEJsb2NrU3R5bGUgICAgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgQ29udGVudFN0cmluZyA9PiAkT3V0cHV0LAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgX01lbW9yeVN3YXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKCiAgICBteSAkTWVtSW5mb0ZpbGU7CiAgICBteSAkTWVtVG90YWw7CiAgICBteSAkTWVtRnJlZTsKICAgIG15ICRTd2FwVG90YWw7CiAgICBteSAkU3dhcEZyZWU7CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoICReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGZyZWVic2R8ZGFyd2luKS9pICkgewogICAgICAgIGlmICggb3BlbiggJE1lbUluZm9GaWxlLCAnPCcsICIvcHJvYy9tZW1pbmZvIiApICkgeyAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgd2hpbGUgKDwkTWVtSW5mb0ZpbGU+KSB7CiAgICAgICAgICAgICAgICBteSAkVG1wTGluZSA9ICRfOwogICAgICAgICAgICAgICAgaWYgKCAkVG1wTGluZSA9fiAvTWVtVG90YWwvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG90YWwgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVG1wTGluZSA9fiAvTWVtRnJlZS8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRNZW1GcmVlID0gaW50KCRUbXBMaW5lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFRtcExpbmUgPX4gL1N3YXBUb3RhbC8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRTd2FwVG90YWwgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVG1wTGluZSA9fiAvU3dhcEZyZWUvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkU3dhcEZyZWUgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRNZW1JbmZvRmlsZSk7CgogICAgICAgICAgICAjIGJ1aWxkIHJldHVybiBoYXNoCiAgICAgICAgICAgIG15ICREZXNjcmlwdGlvbiA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RoZSBIb3N0IFN5c3RlbSBoYXMnKSAuICI6IFxuIgogICAgICAgICAgICAgICAgLiBpbnQoICRNZW1Ub3RhbCAvIDEwMjQgKSAuICcgJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdNQiBNZW1vcnkgdG90YWwnKSAuICIgXG4iCiAgICAgICAgICAgICAgICAuIGludCggJE1lbUZyZWUgLyAxMDI0ICkgLiAnICcKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTUIgTWVtb3J5IGZyZWUnKSAuICIgXG4iCiAgICAgICAgICAgICAgICAuIGludCggJFN3YXBUb3RhbCAvIDEwMjQgKSAuICcgJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdNQiBTd2FwIHRvdGFsJykgLiAiIFxuIgogICAgICAgICAgICAgICAgLiBpbnQoICRTd2FwRnJlZSAvIDEwMjQgKSAuICcgJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdNQiBTd2FwIGZyZWUnKTsKCiAgICAgICAgICAgIGlmICggISRTd2FwVG90YWwgKSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdNZW1vcnkgU3dhcCBDaGVjaycpLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICdBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1N3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4nCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ05vIFN3YXAgZW5hYmxlZCEnKSwKICAgICAgICAgICAgICAgICAgICBDaGVjayAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggKCRTd2FwRnJlZSkgLyAoJFN3YXBUb3RhbCkgPCA2MCApCiAgICAgICAgICAgICAgICB8fCAoICgkU3dhcFRvdGFsKSAtICgkU3dhcEZyZWUpID4gMjAwMDAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdNZW1vcnkgU3dhcCBDaGVjaycpLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICdBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1N3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4nCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICIkRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdNZW1vcnkgU3dhcCBDaGVjaycpLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICdBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1N3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4nCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICIkRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkXk8gPX4gL3dpbjMyL2kgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9DUFVMb2FkQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSBAU3BsaXRBcnJheTsKCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICggJF5PID1+IC8obGludXh8dW5peHxuZXRic2R8ZnJlZWJzZHxkYXJ3aW4pL2kgKSB7CgogICAgICAgICMgbGludXggc3lzdGVtcwogICAgICAgIGlmICggLWUgIi9wcm9jL2xvYWRhdmciICkgewogICAgICAgICAgICBteSAkTG9hZEZpbGU7CiAgICAgICAgICAgIG9wZW4oICRMb2FkRmlsZSwgJzwnLCAiL3Byb2MvbG9hZGF2ZyIgKTsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgIHdoaWxlICg8JExvYWRGaWxlPikgewogICAgICAgICAgICAgICAgQFNwbGl0QXJyYXkgPSBzcGxpdCggIiAiLCAkXyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRMb2FkRmlsZSk7CiAgICAgICAgfQoKICAgICAgICAjIG1hYyBvcwogICAgICAgIGVsc2lmICggJF5PID1+IC9kYXJ3aW4vaSApIHsKICAgICAgICAgICAgaWYgKCBvcGVuKCBteSAkSW4sICItfCIsICJzeXNjdGwgdm0ubG9hZGF2ZyIgKSApIHsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgICAgICB3aGlsZSAoPCRJbj4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIG15ICgkTG9hZHMpID0gJF8gPX4gL3ZtXC5sb2FkYXZnOiBccyogXHsgXHMqICAoLiopIFxzKiBcfS9zbXggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEBTcGxpdEFycmF5ID0gc3BsaXQgJyAnLCAkTG9hZHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xvc2UgJEluOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoQFNwbGl0QXJyYXkpIHsKCiAgICAgICAgICAgICMgYnVpbGQgcmV0dXJuIGhhc2gKICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGhlIEhvc3QgU3lzdGVtIGhhcyBhIGxvYWQnKSAuICI6IFxuIgogICAgICAgICAgICAgICAgLiAkU3BsaXRBcnJheVswXSAuICcgJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdpbiB0aGUgbGFzdCAxIG1pbnV0ZScpIC4gIiBcbiIKICAgICAgICAgICAgICAgIC4gJFNwbGl0QXJyYXlbMV0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnaW4gdGhlIGxhc3QgNSBtaW51dGVzJykgLiAiIFxuIgogICAgICAgICAgICAgICAgLiAkU3BsaXRBcnJheVsyXSAuICcgJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdpbiB0aGUgbGFzdCAxNSBtaW51dGVzJyk7CgogICAgICAgICAgICBpZiAoICRTcGxpdEFycmF5WzJdIDwgJzEuMDAnICkgewogICAgICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ1BVIExvYWQnKSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgICAgICAgICAnQSBDUFUgbG9hZCBjaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3RoZSBzeXN0ZW0gbG9hZCBpbiB0aGUgbGFzdCAxNSBtaW51dGVzID4gMS4nCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICIkRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDUFUgTG9hZCcpLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICdBIENQVSBsb2FkIGNoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAndGhlIHN5c3RlbSBsb2FkIGluIHRoZSBsYXN0IDE1IG1pbnV0ZXMgPCAxLicKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luMzIvaSApIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBfRGlza1VzYWdlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSAgICA9IHt9OwogICAgbXkgJENoZWNrICAgPSAnT0snOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICggJF5PID1+IC8obGludXh8dW5peHxuZXRic2R8ZnJlZWJzZHxkYXJ3aW4pL2kgKSB7CiAgICAgICAgbXkgJENvbW1hbmRsaW5lID0gImRmIC1seCB0bXBmcyAteCBpc285NjYwIC14IHVkZiAteCBzcXVhc2hmcyI7CgogICAgICAgICMgY3VycmVudCBNYWNPUyBhbmQgRnJlZUJTRCBkb2VzIG5vdCBzdXBwb3J0IHRoZSAteCBmbGFnIGZvciBkZgogICAgICAgIGlmICggJF5PID1+IC8oZGFyd2lufGZyZWVic2QpL2kgKSB7CiAgICAgICAgICAgICRDb21tYW5kbGluZSA9ICJkZiAtbCI7CiAgICAgICAgfQoKICAgICAgICBteSAkSW47CiAgICAgICAgaWYgKCBvcGVuKCAkSW4sICItfCIsICIkQ29tbWFuZGxpbmUiICkgKSB7ICAgICMjIG5vIGNyaXRpYwogICAgICAgICAgICB3aGlsZSAoPCRJbj4pIHsKICAgICAgICAgICAgICAgIGlmICggJF8gPX4gL14oLis/KVxzLipccyhcZFxkXGR8XGRcZHxcZCklLis/JC8gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkMiA+IDkwICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2hlY2sgbmUgJ0ZhaWxlZCcgJiYgJDIgPiA4NSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIsIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiQxXFskMiVcXSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgaWYgKCAkQ2hlY2sgZXEgJ0ZhaWxlZCcgKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0Rpc2sgaXMgZnVsbCcpIC4gIiAoJE1lc3NhZ2UpLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0Rpc2sgdXNhZ2UnKSAuICIgKCRNZXNzYWdlKS4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICREYXRhID0gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdEaXNrIFVzYWdlJyksCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGRpc2sgdXNhZ2UuJyksCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gJERhdGE7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9UUlM7CiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6TGF5b3V0T2JqZWN0KQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlBhY2thZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6QXV0aDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IEVuY29kZU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntQYWNrYWdlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntBdXRoT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkF1dGgtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9ICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5hbWVzIG9mIGF2YWlsYWJsZSBjaGVja3MgZnJvbSBzeXNjb25maWcKICAgIG15ICRDaGVja3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6T1RSUycpOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY2hlY2tzIHNob3VsZCBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBzb3J0IGdyZXAgeyAkQ2hlY2tzLT57JF99IH0ga2V5cyAleyRDaGVja3N9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQEVuYWJsZWRDaGVja0Z1bmN0aW9ucykgewoKICAgICAgICAjIHByZXBlbmQgYW4gdW5kZXJzY29yZQogICAgICAgICRGdW5jdGlvbk5hbWUgPSAnXycgLiAkRnVuY3Rpb25OYW1lOwoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgojIGNoZWNrIGlmIGVycm9yIGxvZyBlbnRyaWVzIGFyZSBhdmFpbGFibGUKc3ViIF9Mb2dDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBUaWNrZXQ6OkluZGV4TW9kdWxlIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdPSyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgbXkgJEVycm9yICAgPSAnJzsKCiAgICBteSBATGluZXMgPSBzcGxpdCggL1xuLywgJFNlbGYtPntMb2dPYmplY3R9LT5HZXRMb2coKSApOwogICAgZm9yIChATGluZXMpIHsKICAgICAgICBteSBAUm93ID0gc3BsaXQoIC87Oy8sICRfICk7CiAgICAgICAgaWYgKCAkUm93WzNdICkgewogICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gL2Vycm9yL2kgKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91IGhhdmUgbW9yZSBlcnJvciBsb2cgZW50cmllczogJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RoZXJlIGlzIG9uZSBlcnJvciBsb2cgZW50cnk6ICcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRFcnJvcikgewogICAgICAgICAgICAgICAgICAgICRFcnJvciAuPSAnLCAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEVycm9yIC49ICRSb3dbM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTG9nQ2hlY2snKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBsb2cgZm9yIGVycm9yIGxvZyBlbnRyaWVzLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlIC4gJEVycm9yLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RpY2tldEluZGV4TW9kdWxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgVGlja2V0OjpJbmRleE1vZHVsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkTW9kdWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkluZGV4TW9kdWxlJyk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdTRUxFQ1QgY291bnQoKikgZnJvbSB0aWNrZXQnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA+IDgwMDAwICkgewogICAgICAgICAgICBpZiAoICRNb2R1bGUgPX4gL1J1bnRpbWVEQi8gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1swXSAiCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgICAgICd0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZC4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUm93WzBdID4gNjAwMDAgKSB7CiAgICAgICAgICAgIGlmICggJE1vZHVsZSA9fiAvUnVudGltZURCLyApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMF0gIgogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICAgICAndGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IHNob3VsZCB1c2UgdGhlIFN0YXRpY0RCIGJhY2tlbmQuIFNlZSBhZG1pbiBtYW51YWwgKFBlcmZvcm1hbmNlIFR1bmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91IGFyZSB1c2luZycpCiAgICAgICAgICAgICAgICAuICIgXCIkTW9kdWxlXCIsICIgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJ0aGF0J3MgZmluZSBmb3IiKQogICAgICAgICAgICAgICAgLiAiICRSb3dbMF0gIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3RpY2tldHMgaW4geW91ciBzeXN0ZW0uJyk7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RpY2tldDo6SW5kZXhNb2R1bGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIFRpY2tldDo6SW5kZXhNb2R1bGUgc2V0dGluZy4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RpY2tldFN0YXRpY0RCT3JwaGFuZWRSZWNvcmRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIFRpY2tldDo6SW5kZXhNb2R1bGUgY2hlY2sgZm9yIHJlY29yZHMgaW4gU3RhdGljREIgd2hlbiB1c2luZyBkaWZmZXJlbnQgYmFja2VuZAogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkTW9kdWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkluZGV4TW9kdWxlJyk7CgogICAgaWYgKCAkTW9kdWxlICF+IC9TdGF0aWNEQi8gKSB7CgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIHRpY2tldF9sb2NrX2luZGV4JyApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzBdICIKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3RpY2tldHMgaW4gU3RhdGljREIgbG9ja19pbmRleCBidXQgeW91IGFyZSB1c2luZyB0aGUnKQogICAgICAgICAgICAgICAgICAgIC4gIiAkTW9kdWxlICIKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgImluZGV4LiBQbGVhc2UgcnVuIG90cnMvYmluL290cnMuQ2xlYW5UaWNrZXRJbmRleC5wbCB0byBjbGVhbiB0aGUgU3RhdGljREIgaW5kZXguIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIHRpY2tldF9pbmRleCcgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMF0gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1swXSAiCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCd0aWNrZXRzIGluIFN0YXRpY0RCIGluZGV4IGJ1dCB5b3UgYXJlIHVzaW5nIHRoZScpCiAgICAgICAgICAgICAgICAgICAgLiAiICRNb2R1bGUgIgogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICAgICAiaW5kZXguIFBsZWFzZSBydW4gb3Rycy9iaW4vb3Rycy5DbGVhblRpY2tldEluZGV4LnBsIHRvIGNsZWFuIHRoZSBTdGF0aWNEQiBpbmRleC4iCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91IGFyZSB1c2luZycpCiAgICAgICAgICAgIC4gIiAkTW9kdWxlLiAiCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU2tpcHBpbmcgdGVzdC4nKTsKICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgfQogICAgaWYgKCAkTWVzc2FnZSBlcSAnJyApIHsKICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ05vIG9ycGhhbmVkIHJlY29yZHMgZm91bmQuJyk7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgfQoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RpY2tldFN0YXRpY0RCT3JwaGFuZWRSZWNvcmRzJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgb3JwaGFuZWQgU3RhdGljREIgcmVjb3Jkcy4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RpY2tldEZ1bGx0ZXh0SW5kZXhNb2R1bGVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBUaWNrZXQ6OkluZGV4TW9kdWxlIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICRNb2R1bGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VhcmNoSW5kZXhNb2R1bGUnKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIGFydGljbGUnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA+IDEwMDAwMCApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlID1+IC9SdW50aW1lREIvICkgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMF0gIgogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICAgICAnYXJ0aWNsZXMgaW4geW91ciBzeXN0ZW0uIFlvdSBzaG91bGQgdXNlIHRoZSBTdGF0aWNEQiBiYWNrZW5kIGZvciBPVFJTIDIuMyBhbmQgaGlnaGVyLiBTZWUgYWRtaW4gbWFudWFsIChQZXJmb3JtYW5jZSBUdW5pbmcpIGZvciBtb3JlIGluZm9ybWF0aW9uLicKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSb3dbMF0gPiA1MDAwMCApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlID1+IC9SdW50aW1lREIvICkgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1swXSAiCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgICAgICdhcnRpY2xlcyBpbiB5b3VyIHN5c3RlbS4gWW91IHNob3VsZCB1c2UgdGhlIFN0YXRpY0RCIGJhY2tlbmQgZm9yIE9UUlMgMi4zIGFuZCBoaWdoZXIuIFNlZSBhZG1pbiBtYW51YWwgKFBlcmZvcm1hbmNlIFR1bmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91IGFyZSB1c2luZycpIC4gIiBcIiRNb2R1bGVcIiwgIgogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJ0aGF0J3MgZmluZSBmb3IiKQogICAgICAgICAgICAgICAgLiAiICRSb3dbMF0gIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ2FydGljbGVzIGluIHlvdXIgc3lzdGVtLicpOwogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlIHNldHRpbmcuJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKIyBPcGVuVGlja2V0Q2hlY2sgY2hlY2sKc3ViIF9PcGVuVGlja2V0Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgIG15ICRDaGVjayAgICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlICAgPSAnJzsKICAgIG15IEBUaWNrZXRJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgU3RhdGVUeXBlICA9PiAnT3BlbicsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICAgICBMaW1pdCAgICAgID0+IDg5OTk5LAogICAgKTsKICAgIGlmICggJCNUaWNrZXRJRHMgPiA4OTk5MCApIHsKICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgJ1lvdSBzaG91bGQgbm90IGhhdmUgbW9yZSB0aGFuIDgwMDAgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3UgY3VycmVudGx5IGhhdmUgb3ZlciA4OTk5OSEgSW4gY2FzZSB5b3Ugd2FudCB0byBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UsIGNsb3NlIG5vdCBuZWVkZWQgb3BlbiB0aWNrZXRzLicKICAgICAgICApOwoKICAgIH0KICAgIGVsc2lmICggJCNUaWNrZXRJRHMgPiAxMDAwMCApIHsKICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgLT5HZXQoJ1lvdSBzaG91bGQgbm90IGhhdmUgb3ZlciA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlICcpCiAgICAgICAgICAgIC4gJCNUaWNrZXRJRHMgLiAnLiAnCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgLT5HZXQoJ0luIGNhc2UgeW91IHdhbnQgdG8gaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlLCBjbG9zZSBub3QgbmVlZGVkIG9wZW4gdGlja2V0cy4nKTsKCiAgICB9CiAgICBlbHNpZiAoICQjVGlja2V0SURzID4gODAwMCApIHsKICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAnWW91IHNob3VsZCBub3QgaGF2ZSBtb3JlIHRoYW4gODAwMCBvcGVuIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uIFlvdSBjdXJyZW50bHkgaGF2ZSAnCiAgICAgICAgICAgICkKICAgICAgICAgICAgLiAkI1RpY2tldElEcwogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgIC0+R2V0KCcuIEluIGNhc2UgeW91IHdhbnQgdG8gaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlLCBjbG9zZSBub3QgbmVlZGVkIG9wZW4gdGlja2V0cy4nKTsKCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdZb3UgaGF2ZSAnKQogICAgICAgICAgICAuICQjVGlja2V0SURzCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4nKTsKICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ09wZW5UaWNrZXRDaGVjaycpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgojIENoZWNrIGlmIHRoZSBjb25maWd1cmVkIEZRRE4gaXMgdmFsaWQuCnN1YiBfRlFETkNvbmZpZ0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdGUUROQ29uZmlnQ2hlY2snKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBpZiB0aGUgY29uZmlndXJlZCBGUUROIGlzIHZhbGlkLicpLAogICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgIENvbW1lbnQgICAgID0+ICcnLAogICAgfTsKCiAgICAjIEdldCB0aGUgY29uZmlndXJlZCBGUUROCiAgICBteSAkRlFETiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJyk7CgogICAgIyBEbyB3ZSBoYXZlIHNldCBvdXIgRlFETj8KICAgIGlmICggJEZRRE4gZXEgJ3lvdXJob3N0LmV4YW1wbGUuY29tJyApIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ0ZhaWxlZCc7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICdQbGVhc2UgY29uZmlndXJlIHlvdXIgRlFETiBpbnNpZGUgdGhlIFN5c0NvbmZpZyBtb2R1bGUuIChjdXJyZW50bHkgdGhlIGRlZmF1bHQgc2V0dGluZycKICAgICAgICAgICAgKQogICAgICAgICAgICAuICIgJyRGUUROJyAiIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnaXMgZW5hYmxlZCkuJyk7CiAgICB9CgogICAgIyBGUUROIHN5bnRheCBjaGVjay4KICAgIGVsc2lmICggJEZRRE4gIX4gL14oW2EtekEtWjAtOV0oW2EtekEtWjAtOVwtXXswLDYxfVthLXpBLVowLTldKT9cLikrW2EtekEtWl17Miw2fSQvICkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnRmFpbGVkJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnSW52YWxpZCBGUUROJykgLiAiICckRlFETicuIjsKICAgIH0KCiAgICAjIE5vdGhpbmcgdG8gY29tcGxhaW4uIDotKAogICAgZWxzZSB7CiAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdPSyc7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJGUUROICckRlFETicgIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ2xvb2tzIGdvb2QuJyk7CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCiMgQ2hlY2sgaWYgdGhlIFN5c3RlbUlEIGNvbnRhaW5zIG9ubHkgZGlnaXRzLgpzdWIgX1N5c3RlbUlEQ29uZmlnQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1N5c3RlbUlEQ29uZmlnQ2hlY2snKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBpZiB0aGUgY29uZmlndXJlZCBTeXN0ZW1JRCBjb250YWlucyBvbmx5IGRpZ2l0cy4nKSwKICAgICAgICBDaGVjayAgID0+ICdGYWlsZWQnLAogICAgICAgIENvbW1lbnQgPT4gJycsCiAgICB9OwoKICAgICMgR2V0IHRoZSBjb25maWd1cmVkIFN5c3RlbUlECiAgICBteSAkU3lzdGVtSUQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3lzdGVtSUQnKTsKCiAgICAjIERvZXMgdGhlIFN5c3RlbUlEIGNvbnRhaW4gbm9uLWRpZ2l0cz8KICAgIGlmICggJFN5c3RlbUlEID1+IC9eXGQrJC8gKSB7CiAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdPSyc7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1lvdXIgU3lzdGVtSUQgc2V0dGluZyBpcycpIC4gIiAkU3lzdGVtSUQuIjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUaGUgU3lzdGVtSUQnKSAuICIgJyRTeXN0ZW1JRCcgIgogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ211c3QgY29uc2lzdCBvZiBkaWdpdHMgZXhjbHVzaXZlbHkuJyk7CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCiMgQ2hlY2sgaWYgVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQgaXMgdmFsaWQKc3ViIF9Db25maWdDaGVja1RpY2tldEZyb250ZW5kUmVzcG9uc2VGb3JtYXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdSZXNwb25zZUZvcm1hdENoZWNrJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgaWYgVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQgY29udGFpbnMgbm8gJERhdGF7IiJ9LicpLAogICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgIENvbW1lbnQgICAgID0+ICcnLAogICAgfTsKCiAgICAjIEdldCB0aGUgY29uZmlnCiAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlJlc3BvbnNlRm9ybWF0Jyk7CgogICAgIyBEb2VzIHRoZSBTeXN0ZW1JRCBjb250YWluIG5vbi1kaWdpdHM/CiAgICBpZiAoICRDb25maWcgIX4gL1wkRGF0YVx7Ii8gKSB7CiAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdPSyc7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJcJERhdGF7XCJcIn0gIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3dhcyBub3QgZm91bmQuJyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ29uZmlnIG9wdGlvbiBUaWNrZXQ6OkZyb250ZW5kOjpSZXNwb25zZUZvcm1hdCBjb2ludGFpbnMnKQogICAgICAgICAgICAuICIgXCREYXRhe1wiXCJ9LCBcJFFEYXRhe1wiXCJ9ICIKICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdzaG91bGQgYmUgdXNlZCBpbnN0YW5kIChzZWUgZGVmYXVsdCBzZXR0aW5nKS4nKTsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9GaWxlU3lzdGVtQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgbXkgJERhdGEgICAgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnRmlsZVN5c3RlbUNoZWNrJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgaWYgZmlsZSBzeXN0ZW0gaXMgd3JpdGFibGUuJyksCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGhlIGZpbGUgc3lzdGVtIGlzIHdyaXRhYmxlLicpLAogICAgfTsKCiAgICBteSAkSG9tZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CgogICAgIyBjaGVjayBIb21lCiAgICBpZiAoICEtZSAkSG9tZSApIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ0ZhaWxlZCc7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ05vIHN1Y2ggaG9tZSBkaXJlY3RvcnknKSAuICI6ICRIb21lISIsCiAgICAgICAgICAgIHJldHVybiAkRGF0YTsKICAgIH0KICAgIGZvciAoCiAgICAgICAgcXcoL2Jpbi8gL0tlcm5lbC8gL0tlcm5lbC9TeXN0ZW0vIC9LZXJuZWwvT3V0cHV0LyAvS2VybmVsL091dHB1dC9IVE1MLyAvS2VybmVsL01vZHVsZXMvKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkRmlsZSA9ICIkSG9tZS8kXy9jaGVja19wZXJtaXNzb25zLiQkIjsKICAgICAgICBpZiAoIG9wZW4oIG15ICRGSUxFLCAnPicsICIkRmlsZSIgKSApIHsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgIHByaW50ICRGSUxFICJ0ZXN0IjsKICAgICAgICAgICAgY2xvc2UoJEZJTEUpOwogICAgICAgICAgICB1bmxpbmsgJEZpbGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTWVzc2FnZSAuPSAiJEZpbGUoJCEpOyI7CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJDYW4ndCB3cml0ZSBmaWxlIikgLiAiOiAkTWVzc2FnZSIsCiAgICAgICAgICAgIHJldHVybiAkRGF0YTsKICAgIH0KCiAgICAkRGF0YS0+e0NoZWNrfSA9ICdPSyc7CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1BhY2thZ2VEZXBsb3lDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BhY2thZ2VEZXBsb3lDaGVjaycpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGRlcGxveW1lbnQgb2YgYWxsIHBhY2thZ2VzLicpLAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQWxsIHBhY2thZ2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkLicpLAogICAgfTsKCiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgZm9yIG15ICRQYWNrYWdlICggJFNlbGYtPntQYWNrYWdlT2JqZWN0fS0+UmVwb3NpdG9yeUxpc3QoKSApIHsKICAgICAgICBteSAkRGVwbG95Q2hlY2sgPSAkU2VsZi0+e1BhY2thZ2VPYmplY3R9LT5EZXBsb3lDaGVjaygKICAgICAgICAgICAgTmFtZSAgICA9PiAkUGFja2FnZS0+e05hbWV9LT57Q29udGVudH0sCiAgICAgICAgICAgIFZlcnNpb24gPT4gJFBhY2thZ2UtPntWZXJzaW9ufS0+e0NvbnRlbnR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJERlcGxveUNoZWNrICkgewogICAgICAgICAgICAkTWVzc2FnZSAuPSAkUGFja2FnZS0+e05hbWV9LT57Q29udGVudH0gLiAnICcgLiAkUGFja2FnZS0+e1ZlcnNpb259LT57Q29udGVudH0gLiAnOyAnOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ0NyaXRpY2FsJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGFja2FnZXMgbm90IGNvcnJlY3RseSBpbnN0YWxsZWQnKSAuICI6ICRNZXNzYWdlLiI7CiAgICB9CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0ludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgdGhlIGRlZmF1bHQgbWVzc2FnZQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnSW52YWxpZFVzZXJMb2NrZWRUaWNrZXRTZWFyY2gnKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZWFyY2ggZm9yIGludmFsaWQgdXNlciB3aXRoIGxvY2tlZCB0aWNrZXRzLicpLAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGhlcmUgYXJlIG5vIGludmFsaWQgdXNlcnMgd2l0aCBsb2NrZWQgdGlja2V0cy4nKSwKICAgIH07CgogICAgIyBnZXQgYWxsIHVzZXJzIChiZWNhdXNlIHRoZXJlIGlzIG5vIGZ1bmN0aW9uIHRvIGdldCBhbGwgaW52YWxpZCB1c2VycykKICAgIG15ICVVc2VyTGlzdCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAwCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSBsaXN0IG9mIGludmFsaWQgdXNlcnMKICAgIG15IEBJbnZhbGlkVXNlciA9ICgpOwogICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVVzZXJMaXN0ICkgewogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFVzZXJ7VmFsaWRJRH0gPT0gMiApIHsKICAgICAgICAgICAgcHVzaCBASW52YWxpZFVzZXIsICRVc2VySUQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRGF0YSBpZiAhQEludmFsaWRVc2VyOwoKICAgIG15IEBUaWNrZXRJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICA9PiAnQVJSQVknLAogICAgICAgIExvY2tJRHMgID0+IFsyXSwKICAgICAgICBPd25lcklEcyA9PiBcQEludmFsaWRVc2VyLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkRGF0YSBpZiAhQFRpY2tldElEczsKCiAgICBteSAlTG9ja2VkVGlja2V0VXNlciA9ICgpOwogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJExvY2tlZFRpY2tldFVzZXJ7ICRUaWNrZXR7T3duZXJJRH0gfSA9ICRVc2VyTGlzdHsgJFRpY2tldHtPd25lcklEfSB9OwogICAgfQoKICAgIG15ICRVc2VyU3RyaW5nID0gam9pbiAnLCAnLCB2YWx1ZXMgJUxvY2tlZFRpY2tldFVzZXI7CiAgICAkRGF0YS0+e0NvbW1lbnR9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGhlc2UgaW52YWxpZCB1c2VycyBoYXZlIGxvY2tlZCB0aWNrZXRzJykgLiAiOiAkVXNlclN0cmluZyI7CiAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ0NyaXRpY2FsJzsKCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfRGVmYXVsdFVzZXJDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IHRoZSBkZWZhdWx0IG1lc3NhZ2UKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0RlZmF1bHRVc2VyQ2hlY2snKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBpZiByb290QGxvY2FsaG9zdCBhY2NvdW50IGhhcyB0aGUgZGVmYXVsdCBwYXNzd29yZC4nKSwKICAgICAgICBDaGVjayAgICAgICA9PiAnT0snLAogICAgICAgIENvbW1lbnQgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RoZXJlIGlzIG5vIGFjdGl2ZSByb290QGxvY2FsaG9zdCB3aXRoIGRlZmF1bHQgcGFzc3dvcmQuJyksCiAgICB9OwoKICAgICMgcmV0cmlldmUgbGlzdCBvZiB2YWxpZCB1c2VycwogICAgbXkgJVVzZXJMaXN0ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ1Nob3J0JywKICAgICAgICBWYWxpZCA9PiAnMScsCiAgICApOwoKICAgIG15ICRTdXBlclVzZXJJRDsKICAgIFVTRVI6CiAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlVXNlckxpc3QgKSB7CiAgICAgICAgaWYgKCAkVXNlckxpc3R7JFVzZXJJRH0gZXEgJ3Jvb3RAbG9jYWxob3N0JyApIHsKICAgICAgICAgICAgJFN1cGVyVXNlcklEID0gMTsKICAgICAgICAgICAgbGFzdCBVU0VSOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkRGF0YSBpZiAhJFN1cGVyVXNlcklEOwoKICAgICMgc2VlIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCBwYXNzd29yZCBhdHRhY2hlZAogICAgbXkgJERlZmF1bHRQYXNzID0gJFNlbGYtPntBdXRoT2JqZWN0fS0+QXV0aCgKICAgICAgICBVc2VyID0+ICdyb290QGxvY2FsaG9zdCcsCiAgICAgICAgUHcgICA9PiAncm9vdCcsCiAgICApOwogICAgcmV0dXJuICREYXRhIGlmICEkRGVmYXVsdFBhc3M7CgogICAgJERhdGEtPntDb21tZW50fSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIkNoYW5nZSB0aGUgcGFzc3dvcmQgb3IgaW52YWxpZGF0ZSB0aGUgYWNjb3VudCAncm9vdFxAbG9jYWxob3N0Jy4iKTsKICAgICREYXRhLT57Q2hlY2t9ICAgPSAnQ3JpdGljYWwnOwoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9EZWZhdWx0U09BUFVzZXJDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NPQVBDaGVjaycpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGRlZmF1bHQgU09BUCBjcmVkZW50aWFscy4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdZb3UgaGF2ZSBub3QgZW5hYmxlZCBTT0FQIG9yIGhhdmUgc2V0IHlvdXIgb3duIHBhc3N3b3JkLicpLAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICB9OwoKICAgIG15ICRTT0FQVXNlciAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU09BUDo6VXNlcicpICAgICB8fCAnJzsKICAgIG15ICRTT0FQUGFzc3dvcmQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU09BUDo6UGFzc3dvcmQnKSB8fCAnJzsKCiAgICBpZiAoICRTT0FQVXNlciBlcSAnc29tZV91c2VyJyApIHsKICAgICAgICBpZiAoICRTT0FQUGFzc3dvcmQgZXEgJ3NvbWVfcGFzcycgfHwgJFNPQVBQYXNzd29yZCBlcSAnJyApIHsKICAgICAgICAgICAgJERhdGEtPntDaGVja30gPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAkRGF0YS0+e0NvbW1lbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BsZWFzZSBzZXQgYSBzdHJvbmcgcGFzc3dvcmQgZm9yIFNPQVA6OlBhc3N3b3JkIGluIFN5c0NvbmZpZy4nKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICREYXRhOwp9CgojIEdlbmVyYWwgU3lzdGVtIE92ZXJ2aWV3CnN1YiBfR2VuZXJhbFN5c3RlbU92ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgICAgICA9IHt9OwogICAgbXkgJFRhYmxlSW5mbyA9ICcnOwogICAgbXkgJENvdW50ZXIgICA9IDA7CgogICAgbXkgJENoZWNrID0gJ09LJzsKCiAgICAkVGFibGVJbmZvCiAgICAgICAgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUHJvZHVjdCcpIC4gJz0nCiAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdCcpCiAgICAgICAgLgogICAgICAgICcgJyAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdWZXJzaW9uJykgLiAnOyc7CgogICAgbXkgJVNlYXJjaCA9ICgKICAgICAgICAxID0+IHsKICAgICAgICAgICAgVGFibGVOYW1lICAgPT4gJ3RpY2tldCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RpY2tldHMnKSwKICAgICAgICB9LAogICAgICAgIDIgPT4gewogICAgICAgICAgICBUYWJsZU5hbWUgICA9PiAnYXJ0aWNsZScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0FydGljbGVzJyksCiAgICAgICAgfSwKICAgICAgICAzID0+IHsKICAgICAgICAgICAgVGFibGVOYW1lICAgPT4gJ3VzZXJzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQWdlbnRzJyksCiAgICAgICAgfSwKICAgICAgICA0ID0+IHsKICAgICAgICAgICAgVGFibGVOYW1lICAgPT4gJ3JvbGVzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUm9sZXMnKSwKICAgICAgICB9LAogICAgICAgIDUgPT4gewogICAgICAgICAgICBUYWJsZU5hbWUgICA9PiAnZ3JvdXBzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnR3JvdXBzJyksCiAgICAgICAgfSwKICAgICk7CgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVNlYXJjaCApIHsKCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnU0VMRUNUIGNvdW50KCopIGZyb20gJyAuICRTZWFyY2h7JEtleX0tPntUYWJsZU5hbWV9ICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRTZWFyY2h7JEtleX0tPntSZXN1bHR9ID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICRUYWJsZUluZm8gLj0gIiRTZWFyY2h7JEtleX0tPntEZXNjcmlwdGlvbn09JFNlYXJjaHskS2V5fS0+e1Jlc3VsdH07IjsKICAgIH0KCiAgICAjIG9ubHkgY2FsY3VsYXRlIGF2ZXJhZ2UgaWYgd2UgYWN0dWFsbHkgaGF2ZSB0aWNrZXRzCiAgICBpZiAoICRTZWFyY2h7MX0tPntSZXN1bHR9ICYmICRTZWFyY2h7Mn0tPntSZXN1bHR9ICkgewogICAgICAgIG15ICRBdmdBcnRpY2xlc1RpY2tldCA9ICRTZWFyY2h7Mn0tPntSZXN1bHR9IC8gJFNlYXJjaHsxfS0+e1Jlc3VsdH07CiAgICAgICAgJEF2Z0FydGljbGVzVGlja2V0ID0gc3ByaW50ZiggIiUuMmYiLCAkQXZnQXJ0aWNsZXNUaWNrZXQgKTsKICAgICAgICAkVGFibGVJbmZvCiAgICAgICAgICAgIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0FydGljbGVzIHBlciB0aWNrZXQgKGF2ZyknKSAuICI9JEF2Z0FydGljbGVzVGlja2V0OyI7CiAgICB9CgogICAgIyAgdGlja2V0cyBwZXIgbW9udGggKGF2ZykKICAgIG15ICRNb250aEluU2Vjb25kcyA9IDI2MjY1NjA7ICAgICMgNjAgKiA2MCAqIDI0ICogMzAuNDsKICAgIG15ICRUaWNrZXRXaW5kb3dUaW1lOyAgICAgICAgICAgICMgaW4gbW9udGhzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gInNlbGVjdCBtYXgoY3JlYXRlX3RpbWVfdW5peCksIG1pbihjcmVhdGVfdGltZV91bml4KSAiIC4KICAgICAgICAgICAgImZyb20gdGlja2V0IHdoZXJlIGlkID4gMSAiLAogICAgKTsKICAgIG15ICRUaWNrZXRDcmVhdGVUaW1lTWF4OwogICAgbXkgJFRpY2tldENyZWF0ZVRpbWVNaW47CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIG1vbnRocyBvbiBzZWNvbmRzCiAgICAgICAgJFRpY2tldENyZWF0ZVRpbWVNYXggPSAkUm93WzBdIHx8IDA7CiAgICAgICAgJFRpY2tldENyZWF0ZVRpbWVNaW4gPSAkUm93WzFdIHx8IDA7CiAgICB9CiAgICAkVGlja2V0V2luZG93VGltZSA9ICggJFRpY2tldENyZWF0ZVRpbWVNYXggLSAkVGlja2V0Q3JlYXRlVGltZU1pbiApIHx8IDE7CiAgICAkVGlja2V0V2luZG93VGltZSA9ICRUaWNrZXRXaW5kb3dUaW1lIC8gJE1vbnRoSW5TZWNvbmRzOwogICAgJFRpY2tldFdpbmRvd1RpbWUgPSAxCiAgICAgICAgaWYgJFRpY2tldFdpbmRvd1RpbWUgPCAxOwogICAgbXkgJEF2ZXJhZ2VUaWNrZXRzTW9udGggPSAkU2VhcmNoezF9LT57UmVzdWx0fSAvICRUaWNrZXRXaW5kb3dUaW1lOwogICAgJEF2ZXJhZ2VUaWNrZXRzTW9udGggPSBzcHJpbnRmKCAiJS4yZiIsICRBdmVyYWdlVGlja2V0c01vbnRoICk7CiAgICAkVGlja2V0V2luZG93VGltZSAgICA9IHNwcmludGYoICIlLjJmIiwgJFRpY2tldFdpbmRvd1RpbWUgKTsKICAgICRUYWJsZUluZm8gLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTW9udGhzIGJldHdlZW4gZmlyc3QgYW5kIGxhc3QgdGlja2V0JykKICAgICAgICAuICI9JFRpY2tldFdpbmRvd1RpbWU7IjsKICAgICRUYWJsZUluZm8KICAgICAgICAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUaWNrZXRzIHBlciBtb250aCAoYXZnKScpIC4gIj0kQXZlcmFnZVRpY2tldHNNb250aDsiOwoKICAgICMgIGF0dGFjaG1lbnRzCiAgICBteSAkU3RvcmFnZU1vZHVsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlN0b3JhZ2VNb2R1bGUnKSB8fCAnJzsKCiAgICBpZiAoICRTdG9yYWdlTW9kdWxlIGVxICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlU3RvcmFnZURCJyApIHsKICAgICAgICBteSAkSG93TWFueUF0dGFjaG1lbnRzOwogICAgICAgIG15ICRBdmVyYWdlQXR0YWNobWVudFNpemUgPSAwOwogICAgICAgIG15ICRBdmdBdHRhY2htZW50VGlja2V0ICAgPSAwOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gInNlbGVjdCBpZCwgY29udGVudF9zaXplIGZyb20gYXJ0aWNsZV9hdHRhY2htZW50ICIgLgogICAgICAgICAgICAgICAgIndoZXJlIGNvbnRlbnRfdHlwZSBub3QgbGlrZSgndGV4dC9odG1sJScpIiwKICAgICAgICApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRIb3dNYW55QXR0YWNobWVudHMrKzsKICAgICAgICAgICAgJEF2ZXJhZ2VBdHRhY2htZW50U2l6ZSA9ICRBdmVyYWdlQXR0YWNobWVudFNpemUgKyAkUm93WzFdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRIb3dNYW55QXR0YWNobWVudHMpIHsKICAgICAgICAgICAgJEF2ZXJhZ2VBdHRhY2htZW50U2l6ZSA9ICRBdmVyYWdlQXR0YWNobWVudFNpemUgLyAkSG93TWFueUF0dGFjaG1lbnRzOwogICAgICAgICAgICAkQXZlcmFnZUF0dGFjaG1lbnRTaXplID0gaW50KCAkQXZlcmFnZUF0dGFjaG1lbnRTaXplIC8gMTAyNCApOwogICAgICAgICAgICAkQXZlcmFnZUF0dGFjaG1lbnRTaXplID0gc3ByaW50ZiggIiUuMmYiLCAkQXZlcmFnZUF0dGFjaG1lbnRTaXplICk7CiAgICAgICAgICAgICRBdmdBdHRhY2htZW50VGlja2V0ICAgPSAkSG93TWFueUF0dGFjaG1lbnRzIC8gJFNlYXJjaHsxfS0+e1Jlc3VsdH07CiAgICAgICAgICAgICRBdmdBdHRhY2htZW50VGlja2V0ICAgPSBzcHJpbnRmKCAiJS4yZiIsICRBdmdBdHRhY2htZW50VGlja2V0ICk7CiAgICAgICAgfQoKICAgICAgICAkVGFibGVJbmZvIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0F0dGFjaG1lbnRzIHBlciB0aWNrZXQgKGF2ZyknKQogICAgICAgICAgICAuICI9JEF2Z0F0dGFjaG1lbnRUaWNrZXQ7IjsKICAgICAgICAkVGFibGVJbmZvIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0F0dGFjaG1lbnQgc2l6ZSAoYXZnKScpCiAgICAgICAgICAgIC4gIj0kQXZlcmFnZUF0dGFjaG1lbnRTaXplIEtCOyI7CiAgICB9CgogICAgIyBjdXN0b21lcnMKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAic2VsZWN0IENPVU5UKERJU1RJTkNUKGN1c3RvbWVyX3VzZXJfaWQpKSAiIC4KICAgICAgICAgICAgImZyb20gdGlja2V0IiwKICAgICk7CiAgICBteSAkQ3VzdG9tZXJzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBtb250aHMgb24gc2Vjb25kcwogICAgICAgICRDdXN0b21lcnMgPSAkUm93WzBdIHx8IDA7CiAgICB9CiAgICAkVGFibGVJbmZvCiAgICAgICAgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VzdG9tZXJzIHdpdGggYXQgbGVhc3Qgb25lIHRpY2tldCcpIC4gIj0kQ3VzdG9tZXJzOyI7CgogICAgIyBvcGVyYXRpbmcgc3lzdGVtCiAgICAkVGFibGVJbmZvIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ09wZXJhdGluZyBzeXN0ZW0nKSAuICI9JF5POyI7CgogICAgIyBpbnN0YWxsIHBhdGgKICAgICRUYWJsZUluZm8gLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnSW5zdGFsbCBkaXJlY3RvcnknKSAuICc9JwogICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdHZW5lcmFsU3lzdGVtT3ZlcnZpZXcnKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdEaXNwbGF5IGEgZ2VuZXJhbCBzeXN0ZW0gb3ZlcnZpZXcnKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHlvdXIgc3lzdGVtLicpLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICBCbG9ja1N0eWxlICA9PiAnVGFibGVEYXRhU2ltcGxlJywKICAgICAgICBUYWJsZUluZm8gICA9PiAkVGFibGVJbmZvLAogICAgfTsKCiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6SUlTOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OkxheW91dE9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OldlYnNlcnZlcjo6SUlTJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfUGVybEV4Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgaWYgKCAkRU5WeydHQVRFV0FZX0lOVEVSRkFDRSd9ICYmICRFTlZ7J0dBVEVXQVlfSU5URVJGQUNFJ30gPX4gL15DR0ktUGVybEV4L2kgKSB7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGVybEV4IGlzIGluIHVzZScpIC4gIiAoJEVOVnsnR0FURVdBWV9JTlRFUkZBQ0UnfSkuIjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdZb3Ugc2hvdWxkIHVzZSBQZXJsRXggdG8gaW5jcmVhc2UgeW91ciBwZXJmb3JtYW5jZS4nKTsKICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdQZXJsRXgnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGlmIFBlcmxFeCBpcyB1c2VkLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfSUlTVmVyc2lvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgICAgPSB7fTsKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gKSB7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91IGFyZSBydW5uaW5nJykgLiAiICRFTlZ7U0VSVkVSX1NPRlRXQVJFfS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NvdWxkIG5vdCBkZXRlcm1pbmUgSUlTIHZlcnNpb24uJyk7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdJSVMgVmVyc2lvbicpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0Rpc3BsYXkgd2ViIHNlcnZlciB2ZXJzaW9uLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfSUlTRW52aXJvbm1lbnRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFbnZpcm9ubWVudCA9ICVFTlY7CgogICAgZm9yIG15ICROb3ROZWVkZWRTdHJpbmcgKAogICAgICAgIHF3KCBIVFRQX1JFRkVSRVIgICAgICAgICBIVFRQX0NBQ0hFX0NPTlRST0wgICBIVFRQX0NPT0tJRSAgICBIVFRQX1VTRVJfQUdFTlQKICAgICAgICBIVFRQX0FDQ0VQVF9MQU5HVUFHRSBIVFRQX0FDQ0VQVF9FTkNPRElORyBIVFRQX0FDQ0VQVAogICAgICAgIFFVRVJZX1NUUklORyAgICAgICAgIFJFUVVFU1RfTUVUSE9EICAgICAgIFJFUVVFU1RfVVJJICAgIFNDUklQVF9OQU1FCiAgICAgICAgQUxMVVNFUlNQUk9GSUxFICAgICAgQVBQREFUQSAgICAgICAgICAgICAgTE9DQUxBUFBEQVRBICAgQ09NTU9OUFJPR1JBTUZJTEVTCiAgICAgICAgUFJPR1JBTURBVEEgICAgICAgICAgUFJPR1JBTUZJTEVTICAgICAgICAgUFNNT0RVTEVQQVRIICAgUFVCTElDCiAgICAgICAgU1lTVEVNRFJJVkUgICAgICAgICAgU1lTVEVNUk9PVCAgICAgICAgICAgVEVNUCAgICAgICAgICAgV0lORElSCiAgICAgICAgVVNFUlBST0ZJTEUgKQogICAgICAgICkKICAgIHsKICAgICAgICBkZWxldGUgJEVudmlyb25tZW50eyROb3ROZWVkZWRTdHJpbmd9OwogICAgfQoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NlcnZlciBFbnZpcm9ubWVudCcpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0Rpc3BsYXkgZW52aXJvbm1lbnQgdmFyaWFibGVzJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIHN5c3RlbS4nKSwKICAgICAgICBDaGVjayAgICAgICA9PiAnT0snLAogICAgICAgIEJsb2NrU3R5bGUgID0+ICdUYWJsZURhdGFTaW1wbGUnLAogICAgICAgIFRhYmxlSW5mbyAgID0+IFwlRW52aXJvbm1lbnQsCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6QXBhY2hlOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OkxheW91dE9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OldlYnNlcnZlcjo6QXBhY2hlJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfQXBhY2hlVmVyc2lvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgICAgPSB7fTsKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gKSB7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91IGFyZSBydW5uaW5nJykgLiAiICRFTlZ7U0VSVkVSX1NPRlRXQVJFfS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NvdWxkIG5vdCBkZXRlcm1pbmUgQXBhY2hlIHZlcnNpb24uJyk7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBcGFjaGUgVmVyc2lvbicpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0Rpc3BsYXkgd2ViIHNlcnZlciB2ZXJzaW9uLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQXBhY2hlTW9kRGVmbGF0ZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgiWW91IHNob3VsZCBlbmFibGUgbW9kX2RlZmxhdGUuIik7CgogICAgaWYgKCAkRU5We01PRF9QRVJMfSApIHsKICAgICAgICBpZiAoIEFwYWNoZTI6Ok1vZHVsZTo6bG9hZGVkKCdtb2RfZGVmbGF0ZS5jJykgKSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJtb2RfZGVmbGF0ZSBpcyBlbmFibGVkLiIpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGp1c3Qgc2tpcCBpZiBub3QgcnVubmluZyBtb2RfcGVybDIKICAgICAgICByZXR1cm47CiAgICB9CiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnTW9kX2RlZmxhdGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGlmIHRoZSBzeXN0ZW0gdXNlcyBtb2RfZGVmbGF0ZS4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0FwYWNoZU1vZEhlYWRlcnNDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIllvdSBzaG91bGQgZW5hYmxlIG1vZF9oZWFkZXJzLiIpOwoKICAgIGlmICggJEVOVntNT0RfUEVSTH0gKSB7CiAgICAgICAgaWYgKCBBcGFjaGUyOjpNb2R1bGU6OmxvYWRlZCgnbW9kX2hlYWRlcnMuYycpICkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgibW9kX2hlYWRlcnMgaXMgZW5hYmxlZC4iKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBqdXN0IHNraXAgaWYgbm90IHJ1bm5pbmcgbW9kX3BlcmwyCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ01vZF9oZWFkZXJzJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBpZiB0aGUgc3lzdGVtIHVzZXMgbW9kX2hlYWRlcnMuJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9BcGFjaGVFbnZpcm9ubWVudENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUVudmlyb25tZW50ID0gJUVOVjsKCiAgICBmb3IgbXkgJE5vdE5lZWRlZFN0cmluZyAoCiAgICAgICAgcXcoIEhUVFBfUkVGRVJFUiAgICAgICAgIEhUVFBfQ0FDSEVfQ09OVFJPTCAgIEhUVFBfQ09PS0lFICAgIEhUVFBfVVNFUl9BR0VOVAogICAgICAgIEhUVFBfQUNDRVBUX0xBTkdVQUdFIEhUVFBfQUNDRVBUX0VOQ09ESU5HIEhUVFBfQUNDRVBUCiAgICAgICAgUVVFUllfU1RSSU5HICAgICAgICAgUkVRVUVTVF9NRVRIT0QgICAgICAgUkVRVUVTVF9VUkkgICAgU0NSSVBUX05BTUUgKQogICAgICAgICkKICAgIHsKICAgICAgICBkZWxldGUgJEVudmlyb25tZW50eyROb3ROZWVkZWRTdHJpbmd9OwogICAgfQoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NlcnZlciBFbnZpcm9ubWVudCcpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0Rpc3BsYXkgZW52aXJvbm1lbnQgdmFyaWFibGVzJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIHN5c3RlbS4nKSwKICAgICAgICBDaGVjayAgICAgICA9PiAnT0snLAogICAgICAgIEJsb2NrU3R5bGUgID0+ICdUYWJsZURhdGFTaW1wbGUnLAogICAgICAgIFRhYmxlSW5mbyAgID0+IFwlRW52aXJvbm1lbnQsCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0FwYWNoZURCSUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIGNoZWNrIGlmIEFwYWNoZTo6REJJIGlzIGxvYWRlZAogICAgbXkgJEFwYWNoZURCSSA9IDA7CiAgICBteSAkQ2hlY2sgICAgID0gJyc7CiAgICBteSAkTWVzc2FnZSAgID0gJyc7CiAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ICkgewogICAgICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICVJTkMgKSB7CiAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLy86Oi9nOwogICAgICAgICAgICAkTW9kdWxlID1+IHMvXC5wbSQvL2c7CiAgICAgICAgICAgIGlmICggJE1vZHVsZSBlcSAnQXBhY2hlOjpEQkknIHx8ICRNb2R1bGUgZXEgJ0FwYWNoZTI6OkRCSScgKSB7CiAgICAgICAgICAgICAgICAkQXBhY2hlREJJID0gJE1vZHVsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICEkQXBhY2hlREJJICkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICdBcGFjaGU6OkRCSSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYSBiZXR0ZXIgcGVyZm9ybWFuY2UgKHByZS1lc3RhYmxpc2ggZGF0YWJhc2UgY29ubmVjdGlvbnMpLicKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAkQXBhY2hlREJJOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIEp1c3Qgc2tpcCB0aGlzIHRlc3QgaWYgd2UnIHJlIG5vdCBydW5uaW5nIG1vZF9wZXJsLgogICAgICAgIHJldHVybjsKICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdBcGFjaGU6OkRCSScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgaWYgdGhlIHN5c3RlbSB1c2VzIEFwYWNoZTo6REJJLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQXBhY2hlUmVsb2FkQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgcmVsb2FkIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIGlmICggJEVOVntNT0RfUEVSTH0gKSB7CiAgICAgICAgZXZhbCAicmVxdWlyZSBtb2RfcGVybCI7ICAgICMjIG5vIGNyaXRpYwogICAgICAgIGlmICggZGVmaW5lZCAkbW9kX3Blcmw6OlZFUlNJT04gKSB7ICAgICMjIG5vIGNyaXRpYwogICAgICAgICAgICBpZiAoICRtb2RfcGVybDo6VkVSU0lPTiA+PSAxLjk5ICkgeyAgICAjIyBubyBjcml0aWMKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIEFwYWNoZTo6UmVsb2FkIGlzIGxvYWRlZAogICAgICAgICAgICAgICAgbXkgJEFwYWNoZVJlbG9hZCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAlSU5DICkgewogICAgICAgICAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLy86Oi9nOwogICAgICAgICAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLnBtJC8vZzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRNb2R1bGUgZXEgJ0FwYWNoZTo6UmVsb2FkJyB8fCAkTW9kdWxlIGVxICdBcGFjaGUyOjpSZWxvYWQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXBhY2hlUmVsb2FkID0gJE1vZHVsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkQXBhY2hlUmVsb2FkICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ0luZm8nOwogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICAgICAgICAgJ0FwYWNoZTo6UmVsb2FkIG9yIEFwYWNoZTI6OlJlbG9hZCBzaG91bGQgYmUgdXNlZCBhcyBQZXJsTW9kdWxlIGFuZCBQZXJsSW5pdEhhbmRsZXIgdG8gcHJldmVudCB3ZWIgc2VydmVyIHJlc3RhcnRzIHdoZW4gaW5zdGFsbGluZyBhbmQgdXBncmFkaW5nIG1vZHVsZXMuJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkQXBhY2hlUmVsb2FkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgSnVzdCBza2lwIHRoaXMgdGVzdCBpZiB3ZScgcmUgbm90IHJ1bm5pbmcgbW9kX3BlcmwuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FwYWNoZTo6UmVsb2FkJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBpZiB0aGUgc3lzdGVtIHVzZXMgQXBhY2hlOjpSZWxvYWQvQXBhY2hlMjo6UmVsb2FkLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQ0dJQWNjZWxlcmF0b3JDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ICkgewoKICAgICAgICAjIGNoZWNrIG1vZF9wZXJsIHZlcnNpb24KICAgICAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ID1+IC9cLzEuOTkvICkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91IHVzZSBhIGJldGEgdmVyc2lvbiBvZiBtb2RfcGVybCcpCiAgICAgICAgICAgICAgICAuICIgKCRFTlZ7TU9EX1BFUkx9KSwgIgogICAgICAgICAgICAgICAgLgogICAgICAgICAgICAgICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgneW91IHNob3VsZCB1cGdyYWRlIHRvIGEgc3RhYmxlIHZlcnNpb24uJyk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEVOVntNT0RfUEVSTH0gPX4gL1wvMS8gKSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdZb3Ugc2hvdWxkIHVwZGF0ZSBtb2RfcGVybCB0bycpCiAgICAgICAgICAgICAgICAuICIgMi54ICgkRU5We01PRF9QRVJMfSkuIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAkRU5We01PRF9QRVJMfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRFTlZ7U0VSVkVSX1NPRlRXQVJFfSA9fiAvZmFzdGNnaS9pICkgewogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1lvdSBhcmUgdXNpbmcgRmFzdENHSS4nKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayAgID0gJ0NyaXRpY2FsJzsKICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1lvdSBzaG91bGQgdXNlIEZhc3RDR0kgb3IgbW9kX3BlcmwgdG8gaW5jcmVhc2UgeW91ciBwZXJmb3JtYW5jZS4nKTsKICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NHSSBBY2NlbGVyYXRvcicpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGZvciBDR0kgQWNjZWxlcmF0b3IuJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjpvcmFjbGU7CiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6TGF5b3V0T2JqZWN0KQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBEQk9iamVjdCBFbmNvZGVPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5hbWVzIG9mIGF2YWlsYWJsZSBjaGVja3MgZnJvbSBzeXNjb25maWcKICAgIG15ICRDaGVja3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6RGF0YWJhc2U6Ok9yYWNsZScpOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY2hlY2tzIHNob3VsZCBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBzb3J0IGdyZXAgeyAkQ2hlY2tzLT57JF99IH0ga2V5cyAleyRDaGVja3N9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQEVuYWJsZWRDaGVja0Z1bmN0aW9ucykgewoKICAgICAgICAjIHByZXBlbmQgYW4gdW5kZXJzY29yZQogICAgICAgICRGdW5jdGlvbk5hbWUgPSAnXycgLiAkRnVuY3Rpb25OYW1lOwoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgpzdWIgX09yYWNsZUhvbWVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBjaGVjayBPUkFDTEVfSE9NRQogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTm8gT1JBQ0xFX0hPTUUgc2V0dGluZyBmb3VuZC4nKTsKICAgIGlmICggJEVOVntPUkFDTEVfSE9NRX0gKSB7CiAgICAgICAgaWYgKCAhLWUgJEVOVntPUkFDTEVfSE9NRX0gKSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgiT1JBQ0xFX0hPTUUgZG9lcyBub3QgZXhpc3QuIikKICAgICAgICAgICAgICAgIC4gIiAoJEVOVntPUkFDTEVfSE9NRX0pLiI7CiAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdZb3VyIE9SQUNMRV9Ib21lIGNvbmZpZ3VyYXRpb24gaXMnKQogICAgICAgICAgICAgICAgLiAiICRFTlZ7T1JBQ0xFX0hPTUV9LiI7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnT1JBQ0xFX0hPTUUnKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBPUkFDTEVfSE9NRSBjb25maWd1cmF0aW9uLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfTkxTTGFuZ0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBOTFNfTEFORwogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTm8gTkxTX0xBTkcgY29uZmlndXJhdGlvbiBmb3VuZC4nKTsKICAgIGlmICggJEVOVntOTFNfTEFOR30gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgICAgICBpZiAoICRFTlZ7TkxTX0xBTkd9ICF+IC91dGYoXC04fDgpL2kgKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkRU5We05MU19MQU5HfSwgIgogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnbmVlZCAudXRmOCBpbiBOTFNfTEFORyAoZS4gZy4gZ2VybWFuX2dlcm1hbnkudXRmOCkuJyk7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91ciBOTFNfTEFORyBjb25maWd1cmF0aW9uIGlzJykKICAgICAgICAgICAgICAgICAgICAuICIgJEVOVntOTFNfTEFOR30uIjsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91ciBOTFNfTEFORyBjb25maWd1cmF0aW9uIGlzJykKICAgICAgICAgICAgICAgIC4gIiAkRU5We05MU19MQU5HfSI7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05MU19MQU5HJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJDaGVjayBOTFNfTEFORy4iKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX05MU0RhdGVGb3JtYXRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgTkxTX0RBVEVfRk9STUFUCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdObyBOTFNfREFURV9GT1JNQVQgc2V0dGluZyBmb3VuZC4nKTsKICAgIGlmICggJEVOVntOTFNfREFURV9GT1JNQVR9ICkgewogICAgICAgIGlmICggJEVOVntOTFNfREFURV9GT1JNQVR9IG5lICJZWVlZLU1NLUREIEhIMjQ6TUk6U1MiICkgewogICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIk5lZWQgZm9ybWF0ICdZWVlZLU1NLUREIEhIMjQ6TUk6U1MnIGZvciBOTFNfREFURV9GT1JNQVQgKG5vdCIpCiAgICAgICAgICAgICAgICAuICIgJEVOVntOTFNfREFURV9GT1JNQVR9KS4iOwogICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgiWW91ciBOTFNfREFURV9GT1JNQVQgc2V0dGluZyBpcyIpCiAgICAgICAgICAgICAgICAuICIgJEVOVntOTFNfREFURV9GT1JNQVR9LiI7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05MU19EQVRFX0ZPUk1BVCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgTkxTX0RBVEVfRk9STUFULicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfTkxTRGF0ZUZvcm1hdFNlbGVjdENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBOTFNfREFURV9GT1JNQVQKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ05MU19EQVRFX0ZPUk1BVCBzZWVtcyB0byBiZSB3cm9uZycpOwogICAgbXkgJENyZWF0ZVRpbWU7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gIlNFTEVDVCBjcmVhdGVfdGltZSBGUk9NIHZhbGlkIiwKICAgICAgICBMaW1pdCA9PiAxCiAgICApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ3JlYXRlVGltZSA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRDcmVhdGVUaW1lKSB7CiAgICAgICAgaWYgKCAkQ3JlYXRlVGltZSAhfiAvXlxkXGRcZFxkLShcZHxcZFxkKS0oXGR8XGRcZClccyhcZHxcZFxkKTooXGR8XGRcZCk6KFxkfFxkXGQpLyApIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENyZWF0ZVRpbWUgIgogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJpcyBub3QgdGhlIHJpZ2h0IGZvcm1hdCAneXl5eS1tbS1kZCBoaDptbTo6c3MnIChwbGVhc2UgY2hlY2siKQogICAgICAgICAgICAgICAgLiAiIFwkRU5We05MU19EQVRFX0ZPUk1BVH0pLiI7CiAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdOTFNfREFURV9Gb3JtYXQgaGFzIHRoZSByaWdodCBmb3JtYXQnKQogICAgICAgICAgICAgICAgLiAiICgkQ3JlYXRlVGltZSkuIjsKICAgICAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lID0+ICdOTFNfREFURV9TRUxFQ1RfRk9STUFUJywKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBOTFNfREFURV9GT1JNQVQgYnkgdXNpbmcgU0VMRUNUIHN0YXRlbWVudC4nKSwKICAgICAgICBDb21tZW50ID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHRhYmxlIGNoZWNrCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiL3NjcmlwdHMvZGF0YWJhc2Uvb3Rycy1zY2hlbWEueG1sIjsKICAgIGlmICggLWYgJEZpbGUgKSB7CiAgICAgICAgbXkgJENvdW50ICAgPSAwOwogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICAgICBteSAkQ29udGVudCA9ICcnOwogICAgICAgIG15ICRJbjsKICAgICAgICBpZiAoIG9wZW4oICRJbiwgJzwnLCAiJEZpbGUiICkgKSB7ICAgICMjIG5vIGNyaXRpYwogICAgICAgICAgICB3aGlsZSAoPCRJbj4pIHsKICAgICAgICAgICAgICAgICRDb250ZW50IC49ICRfOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRJbik7CiAgICAgICAgICAgIG15IEBYTUxIYXNoID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxQYXJzZTJYTUxIYXNoKCBTdHJpbmcgPT4gJENvbnRlbnQgKTsKICAgICAgICAgICAgZm9yIG15ICRUYWJsZSAoIEB7ICRYTUxIYXNoWzFdLT57ZGF0YWJhc2V9LT5bMV0tPntUYWJsZX0gfSApIHsKICAgICAgICAgICAgICAgIGlmICgkVGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMICAgPT4gInNlbGVjdCAqIGZyb20gJFRhYmxlLT57TmFtZX0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGltaXQgPT4gMQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkVGFibGUtPntOYW1lfSwgIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIlRhYmxlIGRvbid0IGV4aXN0cyIpIC4gIjogJE1lc3NhZ2UuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRDb3VudCAiIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgndGFibGVzIGNoZWNrZWQuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUYWJsZSBDaGVjaycpLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUYWJsZSBDaGVjaycpLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIkNhbid0IG9wZW4gZmlsZSIpIC4gIiAkRmlsZTogJCEiLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGFibGUgQ2hlY2snKSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nKSwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgiQ2FuJ3QgZmluZCBmaWxlIikgLiAiICRGaWxlISIsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9DdXJyZW50VGltZXN0YW1wQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhICAgPSB7fTsKICAgIG15ICREYlRpbWUgPSAnJzsKCiAgICAjIEN1cnJlbnQgVGltZXN0YW1wIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICcnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHRvX2NoYXIoY3VycmVudF90aW1lc3RhbXAsJ1lZWVktTU0tREQgSEgyNDpNSTpTUycpIEZST00gRFVBTCIKICAgICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYlRpbWUgPSAkUm93WzBdOwogICAgfQogICAgbXkgJFRpbWVBcHBsaWNhdGlvblNlcnZlciA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKICAgIG15ICRUaW1lRGF0YWJhc2VTZXJ2ZXIgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICBTdHJpbmcgPT4gJERiVGltZSwKICAgICk7CgogICAgbXkgJFRpbWVEaWZmZXJlbmNlID0gMDsKICAgIG15ICRSYW5nZSAgICAgICAgICA9IDEwOwogICAgJFRpbWVEaWZmZXJlbmNlID0gJFRpbWVBcHBsaWNhdGlvblNlcnZlciAtICRUaW1lRGF0YWJhc2VTZXJ2ZXI7CiAgICBpZiAoICggJFRpbWVEaWZmZXJlbmNlID49ICggJFJhbmdlICogLTEgKSApICYmICggJFRpbWVEaWZmZXJlbmNlIDw9ICRSYW5nZSApICkgewogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICdUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyIHRpbWUgYW5kIGRhdGFiYXNlIHNlcnZlciB0aW1lLicKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RoZXJlIGlzIGEgbWF0ZXJpYWwgZGlmZmVyZW5jZSAoJykKICAgICAgICAgICAgLiAkVGltZURpZmZlcmVuY2UKICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCcgc2Vjb25kcykgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgKCcpCiAgICAgICAgICAgIC4gJFRpbWVBcHBsaWNhdGlvblNlcnZlciAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJykgYW5kIGRhdGFiYXNlIHNlcnZlciAoJykKICAgICAgICAgICAgLiAkVGltZURhdGFiYXNlU2VydmVyIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnKSB0aW1lLicpOwogICAgfQoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0N1cnJlbnQgVGltZXN0YW1wIENoZWNrJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgIlN5c3RlbSBUaW1lIiB2cyAiQ3VycmVudCBUaW1lc3RhbXAiLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjptc3NxbDsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpMYXlvdXRPYmplY3QpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1hNTE9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6TVNTUUwnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9WZXJzaW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdmVyc2lvbiBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ291bGQgbm90IGRldGVybWluZSBNaWNyb3NvZnQgU1FMIFNlcnZlciB2ZXJzaW9uLicpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBAQHZlcnNpb24nLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1lc3NhZ2UgPSAkUm93WzBdOwogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdWZXJzaW9uJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgZGF0YWJhc2UgdmVyc2lvbi4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RhdGFiYXNlU2l6ZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIERhdGFiYXNlIHNpemUgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NvdWxkIG5vdCBkZXRlcm1pbmUgZGF0YWJhc2Ugc2l6ZS4nKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdleGVjIHNwX3NwYWNldXNlZCcsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWVzc2FnZSA9CiAgICAgICAgICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0RhdGFiYXNlJykKICAgICAgICAgICAgLiAiICRSb3dbMF0gIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ2lzJykgLiAiICRSb3dbMV0gIgogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ2xhcmdlLCBvZiB3aGljaCcpCiAgICAgICAgICAgIC4gIiAkUm93WzJdICIgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdpcyBhdmFpbGFibGUuJyk7CiAgICAgICAgJENoZWNrID0gJ09LJzsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTaXplJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgZGF0YWJhc2Ugc2l6ZS4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RhdGFiYXNlSG9zdG5hbWVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBEYXRhYmFzZSBzaXplIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDb3VsZCBub3QgZGV0ZXJtaW5lIGRhdGFiYXNlIGhvc3RuYW1lLicpOwoKICAgIGlmICggbXkgJERhdGFiYXNlSG9zdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEYXRhYmFzZUhvc3QnKSApIHsKICAgICAgICAkTWVzc2FnZSA9ICREYXRhYmFzZUhvc3Q7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgfQoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0hvc3RuYW1lJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgZGF0YWJhc2UgaG9zdG5hbWUuJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHRhYmxlIGNoZWNrCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3NjcmlwdHMvZGF0YWJhc2Uvb3Rycy1zY2hlbWEueG1sJzsKICAgIGlmICggLWYgJEZpbGUgKSB7CiAgICAgICAgbXkgJENvdW50ICAgPSAwOwogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICAgICBteSAkQ29udGVudCA9ICcnOwogICAgICAgIG15ICRJbjsKICAgICAgICBpZiAoIG9wZW4oICRJbiwgJzwnLCAkRmlsZSApICkgeyAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaCggU3RyaW5nID0+ICRDb250ZW50ICk7CiAgICAgICAgICAgIGZvciBteSAkVGFibGUgKCBAeyAkWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVGFibGUtPntOYW1lfSBlcSAnc3lzdGVtX3VzZXInICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVGFibGUtPntOYW1lfSA9ICdzeXN0ZW1fdXNlcjInOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMICAgPT4gInNlbGVjdCAqIGZyb20gJFRhYmxlLT57TmFtZX0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGltaXQgPT4gMQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkVGFibGUtPntOYW1lfSwgIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIlRhYmxlIGRvZXNuJ3QgZXhpc3QiKSAuICI6ICRNZXNzYWdlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRDb3VudCAiIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgndGFibGVzLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGFibGUgQ2hlY2snKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJyksCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGFibGUgQ2hlY2snKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJyksCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJDYW4ndCBvcGVuIGZpbGUiKSAuICIgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RhYmxlIENoZWNrJyksCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJyksCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIkNhbid0IGZpbmQgZmlsZSIpIC4gIiAkRmlsZSEiLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGN1cnJlbnRfdGltZXN0YW1wIiApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGJUaW1lID0gJFJvd1swXTsKICAgIH0KICAgIG15ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICBteSAkVGltZURhdGFiYXNlU2VydmVyICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICREYlRpbWUsCiAgICApOwoKICAgIG15ICRUaW1lRGlmZmVyZW5jZSA9IDA7CiAgICBteSAkUmFuZ2UgICAgICAgICAgPSAxMDsKICAgICRUaW1lRGlmZmVyZW5jZSA9ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgLSAkVGltZURhdGFiYXNlU2VydmVyOwogICAgaWYgKCAoICRUaW1lRGlmZmVyZW5jZSA+PSAoICRSYW5nZSAqIC0xICkgKSAmJiAoICRUaW1lRGlmZmVyZW5jZSA8PSAkUmFuZ2UgKSApIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAnVGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGFwcGxpY2F0aW9uIHNlcnZlciB0aW1lIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgdGltZS4nCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUaGVyZSBpcyBhIG1hdGVyaWFsIGRpZmZlcmVuY2UgKCcpCiAgICAgICAgICAgIC4gJFRpbWVEaWZmZXJlbmNlCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnIHNlY29uZHMpIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyICgnKQogICAgICAgICAgICAuICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCcpIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgKCcpCiAgICAgICAgICAgIC4gJFRpbWVEYXRhYmFzZVNlcnZlciAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJykgdGltZS4nKTsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDdXJyZW50IFRpbWVzdGFtcCBDaGVjaycpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrICJTeXN0ZW0gVGltZSIgdnMgIkN1cnJlbnQgVGltZXN0YW1wIi4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjpwb3N0Z3Jlc3FsOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OkxheW91dE9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57WE1MT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUaW1lT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OkRhdGFiYXNlOjpQb3N0Z3JlU1FMJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfVGFibGVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyB0YWJsZSBjaGVjawogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9zY3JpcHRzL2RhdGFiYXNlL290cnMtc2NoZW1hLnhtbCc7CiAgICBpZiAoIC1mICRGaWxlICkgewogICAgICAgIG15ICRDb3VudCAgID0gMDsKICAgICAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICAgICAgbXkgJENvbnRlbnQgPSAnJzsKICAgICAgICBteSAkSW47CiAgICAgICAgaWYgKCBvcGVuKCAkSW4sICc8JywgJEZpbGUgKSApIHsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goIFN0cmluZyA9PiAkQ29udGVudCApOwogICAgICAgICAgICBmb3IgbXkgJFRhYmxlICggQHsgJFhNTEhhc2hbMV0tPntkYXRhYmFzZX0tPlsxXS0+e1RhYmxlfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgICA9PiAic2VsZWN0ICogZnJvbSAkVGFibGUtPntOYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW1pdCA9PiAxCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRUYWJsZS0+e05hbWV9LCAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnbm9uZXhpc3RpbmcgdGFibGUocyknKSAuICI6ICRNZXNzYWdlLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkQ291bnQgIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3RhYmxlcyBjaGVja2VkLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGFibGUgQ2hlY2snKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJyksCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGFibGUgQ2hlY2snKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJyksCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJDYW4ndCBvcGVuIGZpbGUiKSAuICIgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RhYmxlIENoZWNrJyksCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJyksCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIkNhbid0IGZpbmQgZmlsZSIpIC4gIiAkRmlsZSEiLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnQ3JpdGljYWwnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfRGF0ZVN0eWxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgRGF0ZXN0eWxlIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gRGF0ZVN0eWxlIGZvdW5kLic7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IGFsbCcgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eRGF0ZVN0eWxlL2kgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1sxXSA9fiAvXklTTy9pICkgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1sxXSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdVbmtub3duIERhdGVTdHlsZScpCiAgICAgICAgICAgICAgICAgICAgLiAiICgkUm93WzFdKSAiCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCduZWVkIElTTy4nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0RhdGVTdHlsZScpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIERhdGVTdHlsZS4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhTZXJ2ZXJDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyB1dGYtOCBzZXJ2ZXIgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgPX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTm8gc2VydmVyX2VuY29kaW5nIGZvdW5kLicpOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgYWxsJyApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSA9fiAvXnNlcnZlcl9lbmNvZGluZy9pICkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJTZXR0aW5nIHNlcnZlcl9lbmNvZGluZyBmb3VuZCwgYnV0IGl0J3Mgc2V0IHRvIikKICAgICAgICAgICAgICAgICAgICAuICIgJyRSb3dbMV0nICIgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCcobmVlZCB0byBiZSBVTklDT0RFIG9yIFVURjgpLicpOwogICAgICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC8oVU5JQ09ERXx1dGYoOHxcLTgpKS9pICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU2VydmVyIENvbm5lY3Rpb24gKHV0ZjgpJyksCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIHRoZSB1dGY4IHNlcnZlciBjb25uZWN0aW9uLicpLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVVRGOENsaWVudENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHV0Zi04IGNsaWVudCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdObyBjbGllbnRfZW5jb2RpbmcgZm91bmQuJyk7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyBhbGwnICk7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eY2xpZW50X2VuY29kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoIlNldHRpbmcgY2xpZW50X2VuY29kaW5nIGZvdW5kLCBidXQgaXQncyBzZXQgdG8iKQogICAgICAgICAgICAgICAgICAgIC4gIiAnJFJvd1sxXScgIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJyhuZWVkIHRvIGJlIFVOSUNPREUgb3IgVVRGOCknKTsKICAgICAgICAgICAgICAgIGlmICggJFJvd1sxXSA9fiAvKFVOSUNPREV8dXRmKDh8XC04KSkvaSApIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1sxXSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NsaWVudCBDb25uZWN0aW9uICh1dGY4KScpLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayB0aGUgdXRmOCBjbGllbnQgY29ubmVjdGlvbi4nKSwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RhdGFiYXNlU2l6ZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIGRpc3BsYXkgZGF0YWJhc2Ugc2l6ZQogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ291bGQgbm90IGRldGVybWluZSBkYXRhYmFzZSBzaXplLicpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gIlNFTEVDVCBwZ19zaXplX3ByZXR0eShwZ19kYXRhYmFzZV9zaXplKGN1cnJlbnRfZGF0YWJhc2UoKSkpIiwKICAgICAgICBMSU1JVCA9PiAxLAogICAgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdICkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnRGF0YWJhc2Ugc2l6ZSBpcycpIC4gIiAkUm93WzBdIjsKICAgICAgICB9CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdEYXRhYmFzZSBTaXplJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU2l6ZSBvZiB0aGUgY3VycmVudCBkYXRhYmFzZS4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1ZlcnNpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyB2ZXJzaW9uIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdObyBQb3N0Z3JlU1FMIHZlcnNpb24gZm91bmQuJyk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHNlcnZlcl92ZXJzaW9uJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL14oXGR7MSwzfSkuKiQvICkgewogICAgICAgICAgICBpZiAoICQxID4gNyApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlBvc3RncmVTUUwgJFJvd1swXSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdZb3UgdXNlIFBvc3RncmVTUUwgdmVyc2lvbicpIC4gIiAkUm93WzBdLCAiCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCd5b3Ugc2hvdWxkIHVzZSA4Lnggb3IgaGlnbmVyLicpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1Vua25vd24gUG9zdGdyZVNRTCB2ZXJzaW9uJykgLiAiICRSb3dbMF0uIjsKICAgICAgICB9CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdWZXJzaW9uJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgZGF0YWJhc2UgdmVyc2lvbi4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGN1cnJlbnRfdGltZXN0YW1wIiApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGJUaW1lID0gJFJvd1swXTsKICAgIH0KICAgIG15ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICBteSAkVGltZURhdGFiYXNlU2VydmVyICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICREYlRpbWUsCiAgICApOwoKICAgIG15ICRUaW1lRGlmZmVyZW5jZSA9IDA7CiAgICBteSAkUmFuZ2UgICAgICAgICAgPSAxMDsKICAgICRUaW1lRGlmZmVyZW5jZSA9ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgLSAkVGltZURhdGFiYXNlU2VydmVyOwogICAgaWYgKCAoICRUaW1lRGlmZmVyZW5jZSA+PSAoICRSYW5nZSAqIC0xICkgKSAmJiAoICRUaW1lRGlmZmVyZW5jZSA8PSAkUmFuZ2UgKSApIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAnVGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGFwcGxpY2F0aW9uIHNlcnZlciB0aW1lIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgdGltZS4nCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUaGVyZSBpcyBhIG1hdGVyaWFsIGRpZmZlcmVuY2UgKCcpCiAgICAgICAgICAgIC4gJFRpbWVEaWZmZXJlbmNlCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnIHNlY29uZHMpIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyICgnKQogICAgICAgICAgICAuICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCcpIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgKCcpCiAgICAgICAgICAgIC4gJFRpbWVEYXRhYmFzZVNlcnZlciAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJykgdGltZS4nKTsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDdXJyZW50IFRpbWVzdGFtcCBDaGVjaycpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrICJTeXN0ZW0gVGltZSIgdnMgIkN1cnJlbnQgVGltZXN0YW1wIi4nKSwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjpteXNxbDsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpMYXlvdXRPYmplY3QpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1hNTE9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6TXlTUUwnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gc29ydCBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9WZXJzaW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHZlcnNpb24gY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ05vIE15U1FMIHZlcnNpb24gZm91bmQuJyk7CgogICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+e0RCT2JqZWN0fS0+VmVyc2lvbigpOwoKICAgIGlmICggJFZlcnNpb24gPX4gL14oTXlTUUx8TWFyaWFEQikgKFxkezEsM30pXC4oXGR7MSwzfSkuKi8gKSB7CiAgICAgICAgaWYgKCAkMiA+PSA1ICkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJFZlcnNpb247CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ015U1FMIHZlcnNpb24nKSAuCiAgICAgICAgICAgICAgICAiICRWZXJzaW9uLCAiIC4KICAgICAgICAgICAgICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3lvdSBzaG91bGQgdXNlIDUuMCBvciBoaWdoZXIuJyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVW5rbm93biBNeVNRTCB2ZXJzaW9uJykgLiAiICckVmVyc2lvbicuIjsKICAgIH0KCiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdEYXRhYmFzZSBWZXJzaW9uLicpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGRhdGFiYXNlIHZlcnNpb24uJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9VVEY4Q2xpZW50Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTm8gY2hhcmFjdGVyX3NldF9jbGllbnQgc2V0dGluZyBmb3VuZC4nKTsKCiAgICAjIHV0Zi04IGNsaWVudCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSAhfiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgI25leHQgaWYgcm93IG5vdCBjaGFyYWN0ZXJfc2V0X2NsaWVudAogICAgICAgIG5leHQgaWYgJFJvd1swXSAhfiAvXmNoYXJhY3Rlcl9zZXRfY2xpZW50L2k7CgogICAgICAgIGlmICggJFJvd1sxXSA9fiAvdXRmOC8gKSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdZb3VyIGNsaWVudCBjb25uZWN0aW9uIGlzJykgLiAiICRSb3dbMV0uIjsKCiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgiRm91bmQgY2hhcmFjdGVyX3NldF9jbGllbnQsIGJ1dCBpdCdzIHNldCB0byIpIC4KICAgICAgICAgICAgIiAkUm93WzFdICgiIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnbmVlZHMgdG8gYmUgdXRmOCcpIC4gJykuJzsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NsaWVudCBDb25uZWN0aW9uICh1dGY4KScpLAogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIGlmIHRoZSBjbGllbnQgdXNlcyB1dGY4IGZvciB0aGUgY29ubmVjdGlvbi4nKSwKICAgICAgICBDaGVjayAgID0+ICRDaGVjaywKICAgICAgICBDb21tZW50ID0+ICRNZXNzYWdlLAogICAgfTsKCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVVRGOERhdGFiYXNlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHV0Zi04IGRhdGFiYXNlIGNoZWNrCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Q2hhcnNldCcpICF+IC91dGYoXC04fDgpL2kgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTm8gY2hhcmFjdGVyX3NldF9kYXRhYmFzZSBzZXR0aW5nIGZvdW5kLicpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyB2YXJpYWJsZXMnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXmNoYXJhY3Rlcl9zZXRfZGF0YWJhc2UvaSApIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJDaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIHNldHRpbmcgZm91bmQsIGJ1dCBpdCdzIHNldCB0byIpIC4KICAgICAgICAgICAgICAgICIgJFJvd1sxXSAoIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ25lZWRzIHRvIGJlIHV0ZjgnKSAuICcpLic7CiAgICAgICAgICAgIGlmICggJFJvd1sxXSA9fiAvdXRmOC8gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1lvdXIgZGF0YWJhc2UgY2hhcnNldCBzZXR0aW5nIGlzJykgLiAiICRSb3dbMV0iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0RhdGFiYXNlIENoYXJzZXQgKHV0ZjgpJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hlY2sgaWYgdGhlIGRhdGFiYXNlIHVzZXMgdXRmOCBhcyBjaGFyc2V0LicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhUYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdXRmLTggdGFibGUgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgPX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICBteSAkQ2hlY2sgICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSAgPSAnJzsKICAgICAgICBteSAkTWVzc2FnZTIgPSAnJzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHRhYmxlIHN0YXR1cycgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMTRdICF+IC9edXRmOC9pICkgewogICAgICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gJywgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkUm93WzBdXFskUm93WzE0XVxdIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlMiA9ICRSb3dbMTRdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0ludmFsaWQgY2hhcnNldCBjb2xsYXRpb24gZm9yJykgLiAiOiAkTWVzc2FnZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJE1lc3NhZ2UyOwogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGFibGUgQ29sbGF0aW9uICh1dGY4KScpLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayB0aGUgdXRmOCB0YWJsZSBjaGFyc2V0IGNvbGxhdGlvbi4nKSwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnWW91ciBjaGFyc2V0IGNvbGxhdGlvbiBpcyBzZXQgdG8nKQogICAgICAgICAgICAgICAgLiAiICRNZXNzYWdlLiIsCiAgICAgICAgICAgIENoZWNrID0+ICRDaGVjaywKICAgICAgICB9OwogICAgICAgIHJldHVybiAkRGF0YTsKICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9NYXhBbGxvd2VkUGFja2FnZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgbWF4X2FsbG93ZWRfcGFja2V0IGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdObyAibWF4X2FsbG93ZWRfcGFja2V0IiBjb25maWd1cmF0aW9uIGZvdW5kLicpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyB2YXJpYWJsZXMnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXm1heF9hbGxvd2VkX3BhY2tldC9pICkgewogICAgICAgICAgICBpZiAoICRSb3dbMV0gPCAxMDI0ICogMTAyNCAqIDIwICkgewogICAgICAgICAgICAgICAgJFJvd1sxXSAgPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gJyJtYXhfYWxsb3dlZF9wYWNrZXQiICcgLgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoInNob3VsZCBiZSBoaWdoZXIgdGhhbiAyMCBNQiAoaXQncyIpCiAgICAgICAgICAgICAgICAgICAgLiAiICRSb3dbMV0gTUIpLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUm93WzFdICA9IGludCggJFJvd1sxXSAvIDEwMjQgLyAxMDI0ICk7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1lvdXIgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzJykKICAgICAgICAgICAgICAgICAgICAuICIgJFJvd1sxXSBNQi4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTWF4IFBhY2thZ2UgU2l6ZScpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrICJtYXhfYWxsb3dlZF9wYWNrZXQiIHNldHRpbmcuJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9RdWVyeUNhY2hlU2l6ZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgcXVlcnlfY2FjaGVfc2l6ZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTm8gInF1ZXJ5X2NhY2hlX3NpemUiIHNldHRpbmcgZm91bmQuJyk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHZhcmlhYmxlcycgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID1+IC9ecXVlcnlfY2FjaGVfc2l6ZS9pICkgewogICAgICAgICAgICBpZiAoICEkUm93WzFdICkgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUaGUgc2V0dGluZyAicXVlcnlfY2FjaGVfc2l6ZSIgc2hvdWxkIGJlIHVzZWQuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUm93WzFdIDwgMTAyNCAqIDEwMjQgKiAxMCApIHsKICAgICAgICAgICAgICAgICRSb3dbMV0gPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJUaGUgc2V0dGluZyAncXVlcnlfY2FjaGVfc2l6ZScgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIDEwIE1CIChpdCdzIikKICAgICAgICAgICAgICAgICAgICAuICIgJFJvd1sxXSBNQikuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSb3dbMV0gID0gaW50KCAkUm93WzFdIC8gMTAyNCAvIDEwMjQgKTsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMV0gTUIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUXVlcnkgQ2FjaGUgU2l6ZScpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrICJxdWVyeV9jYWNoZV9zaXplIiBzZXR0aW5nLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfU3RvcmFnZUVuZ2luZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAic2hvdyB2YXJpYWJsZXMgd2hlcmUgdmFyaWFibGVfbmFtZSA9ICdzdG9yYWdlX2VuZ2luZSciICk7CiAgICBteSAkU3RvcmFnZUVuZ2luZTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFN0b3JhZ2VFbmdpbmUgPSAkUm93WzFdOwogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnRGVmYXVsdCBTdG9yYWdlIEVuZ2luZScpLAogICAgICAgIERlc2NyaXB0aW9uID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIERlZmF1bHQgU3RvcmFnZSBFbmdpbmUuJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGhlIGRlZmF1bHQgc3RvcmFnZSBlbmdpbmUgaXMnKQogICAgICAgICAgICAuICIgJFN0b3JhZ2VFbmdpbmUuIiwKICAgICAgICBDaGVjayA9PiAnT0snLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UYWJsZXNXaXRoRGlmZmVyZW50U3RvcmFnZUVuZ2luZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENoZWNrICAgPSAnT0snOwogICAgbXkgJENvbW1lbnQgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdObyB0YWJsZXMgZm91bmQgd2l0aCBkaWZmZXJlbnQgc3RvcmFnZSBlbmdpbmUuJyk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICJzaG93IHZhcmlhYmxlcyB3aGVyZSB2YXJpYWJsZV9uYW1lID0gJ3N0b3JhZ2VfZW5naW5lJyIgKTsKICAgIG15ICRTdG9yYWdlRW5naW5lOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU3RvcmFnZUVuZ2luZSA9ICRSb3dbMV07CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAic2hvdyB0YWJsZSBzdGF0dXMgd2hlcmUgZW5naW5lICE9ID8iLAogICAgICAgIEJpbmQgPT4gWyBcJFN0b3JhZ2VFbmdpbmUgXSwKICAgICk7CiAgICBteSBAVGFibGVzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBUYWJsZXMsICRSb3dbMF07CiAgICB9CgogICAgaWYgKEBUYWJsZXMpIHsKICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICRDb21tZW50ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGhlc2UgdGFibGVzIHVzZSBhIGRpZmZlcmVudCBzdG9yYWdlIGVuZ2luZScpOwogICAgICAgICRDb21tZW50IC49ICc6ICcgLiBqb2luKCAnLCAnLCBAVGFibGVzICk7CiAgICB9CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGFibGVzIHdpdGggZGlmZmVyZW50IHN0b3JhZ2UgZW5naW5lJyksCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGVzdCBpZiB0aGVyZSBhcmUgdGFibGVzIHdpdGggYSBkaWZmZXJlbnQgc3RvcmFnZSBlbmdpbmUuJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJENvbW1lbnQsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9DdXJyZW50VGltZXN0YW1wQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhICAgPSB7fTsKICAgIG15ICREYlRpbWUgPSAnJzsKCiAgICAjIEN1cnJlbnQgVGltZXN0YW1wIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICcnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gIlNFTEVDVCBjdXJyZW50X3RpbWVzdGFtcCIgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERiVGltZSA9ICRSb3dbMF07CiAgICB9CiAgICBteSAkVGltZUFwcGxpY2F0aW9uU2VydmVyID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgbXkgJFRpbWVEYXRhYmFzZVNlcnZlciAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkRGJUaW1lLAogICAgKTsKCiAgICBteSAkVGltZURpZmZlcmVuY2UgPSAwOwogICAgbXkgJFJhbmdlICAgICAgICAgID0gMTA7CiAgICAkVGltZURpZmZlcmVuY2UgPSAkVGltZUFwcGxpY2F0aW9uU2VydmVyIC0gJFRpbWVEYXRhYmFzZVNlcnZlcjsKICAgIGlmICggKCAkVGltZURpZmZlcmVuY2UgPj0gKCAkUmFuZ2UgKiAtMSApICkgJiYgKCAkVGltZURpZmZlcmVuY2UgPD0gJFJhbmdlICkgKSB7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgJ1RoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGltZSBhbmQgZGF0YWJhc2Ugc2VydmVyIHRpbWUuJwogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGhlcmUgaXMgYSBtYXRlcmlhbCBkaWZmZXJlbmNlICgnKQogICAgICAgICAgICAuICRUaW1lRGlmZmVyZW5jZQogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJyBzZWNvbmRzKSBiZXR3ZWVuIGFwcGxpY2F0aW9uIHNlcnZlciAoJykKICAgICAgICAgICAgLiAkVGltZUFwcGxpY2F0aW9uU2VydmVyIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnKSBhbmQgZGF0YWJhc2Ugc2VydmVyICgnKQogICAgICAgICAgICAuICRUaW1lRGF0YWJhc2VTZXJ2ZXIgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCcpIHRpbWUuJyk7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VycmVudCBUaW1lc3RhbXAgQ2hlY2snKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayAiU3lzdGVtIFRpbWUiIHZzICJDdXJyZW50IFRpbWVzdGFtcCIuJyksCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwnOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICRGaWxlICkgKSB7ICAgICMjIG5vIGNyaXRpYwogICAgICAgICAgICB3aGlsZSAoPCRJbj4pIHsKICAgICAgICAgICAgICAgICRDb250ZW50IC49ICRfOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRJbik7CiAgICAgICAgICAgIG15IEBYTUxIYXNoID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxQYXJzZTJYTUxIYXNoKCBTdHJpbmcgPT4gJENvbnRlbnQgKTsKCiAgICAgICAgICAgIG15IEBQcm9ibGVtczsKICAgICAgICAgICAgZm9yIG15ICRUYWJsZSAoIEB7ICRYTUxIYXNoWzFdLT57ZGF0YWJhc2V9LT5bMV0tPntUYWJsZX0gfSApIHsKICAgICAgICAgICAgICAgIGlmICgkVGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgICAgICAgICAgICAgIyB1c2UgJ0NIRUNLIFRBQkxFJy1zdGF0ZW1lbnQgdG8gZGV0ZXJtaW5lIHN0YXRlIG9mIGVhY2ggdGFibGUKICAgICAgICAgICAgICAgICAgICAjICh3aGljaCBtYXkgeWllbGQgc2V2ZXJhbCBsaW5lcyBwZXIgdGFibGUsIHRoZSBsYXN0IG9mIHdoaWNoIHdpbGwKICAgICAgICAgICAgICAgICAgICAjIGNvbnRhaW4gdGhlIG92ZXJhbGwgc3RhdGUgb2YgdGhhdCB0YWJsZSkKICAgICAgICAgICAgICAgICAgICAjIERvIHF1aWNrIGNoZWNrcyBvbiB0YWJsZXMsIG90aGVyIHdheSBpdCB0YWtlcyBvdmVyIDQyMCBzZWMKICAgICAgICAgICAgICAgICAgICAjIG9yIGxvbmdlciB0byBjaGVjayBpdC4KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gIkNIRUNLIFRBQkxFICRUYWJsZS0+e05hbWV9IEZBU1QgUVVJQ0siICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTdGF0dXMgPSAkUm93WzNdOyAgICAjIGxvb2sgYXQgZmllbGQgJ01zZ190ZXh0JwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgaWYgJFN0YXR1cyA9fiAvXihPS3xUYWJsZVxzaXNcc2FscmVhZHlcc3VwXHN0b1xzZGF0ZSkvaTsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAUHJvYmxlbXMsICIkVGFibGUtPntOYW1lfVxbJFN0YXR1c1xdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFByb2JsZW1zLCAiJFRhYmxlLT57TmFtZX1cWyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgndW5hYmxlIHRvIGNoZWNrIHRhYmxlJykgLiAiXF0iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQFByb2JsZW1zKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9IGpvaW4gIlxuIiwgQFByb2JsZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50ICIgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCd0YWJsZXMgY2hlY2tlZC4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RhYmxlIENoZWNrJyksCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLicpLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RhYmxlIENoZWNrJyksCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLicpLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgiQ2FuJ3Qgb3BlbiBmaWxlIikgLiAiICRGaWxlOiAkISIsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAnQ3JpdGljYWwnLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhID0gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUYWJsZSBDaGVjaycpLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLicpLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCJDYW4ndCBmaW5kIGZpbGUiKSAuICIgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RhdGFiYXNlU2l6ZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgY2FsY3VsYXRlIGFuZCBkaXNwbGF5IGRhdGFiYXNlIHNpemUKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NvdWxkIG5vdCBkZXRlcm1pbmUgZGF0YWJhc2Ugc2l6ZS4nKTsKICAgIG15ICREQk5hbWU7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gIlNFTEVDVCBEQVRBQkFTRSgpIiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgJERCTmFtZSA9ICRSb3dbMF07CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkREJOYW1lKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIFJPVU5EKChTVU0oZGF0YV9sZW5ndGggKyBpbmRleF9sZW5ndGgpIC8gMTAyNCAvIDEwMjQgLyAxMDI0KSwzKSAiCiAgICAgICAgICAgICAgICAuICJGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5UQUJMRVMgV0hFUkUgdGFibGVfc2NoZW1hID0gPyBHUk9VUCBCWSB0YWJsZV9zY2hlbWEiLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkREJOYW1lIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdICkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdEYXRhYmFzZSBzaXplIGlzJykgLiAiICRSb3dbMF0gR0IuIjsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRNZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ291bGQgbm90IGRldGVybWluZSBkYXRhYmFzZSBuYW1lLicpOwogICAgfQoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0RhdGFiYXNlIFNpemUnKSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTaXplIG9mIHRoZSBjdXJyZW50IGRhdGFiYXNlLicpLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpMYXlvdXRPYmplY3QpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uIHRvIGEgcnVubmluZyBPVFJTIGhvc3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBXZWJzZXJ2ZXIgaW5mbyBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXI7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJFdlYnNlcnZlckFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgV2Vic2VydmVycwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgIyAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+Q2hlY2soKTsKICAgICMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCB1c2VkIFdlYnNlcnZlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIFdlYnNlcnZlciBpcyBjb25maWd1cmVkCiAgICBteSAkV2Vic2VydmVyVHlwZSA9ICcnOwogICAgaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gPX4gL2FwYWNoZS9pICkgewogICAgICAgICRXZWJzZXJ2ZXJUeXBlID0gJ0FwYWNoZSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkV2Vic2VydmVyVHlwZSA9ICdJSVMnOwogICAgfQoKICAgICMgdHJ5IHRvIGdldCBhdmFpbGFibGUgbW9kdWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXInOwoKICAgICMgcmVhZCBhbGwgYXZhaWxhYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYiggJERpck5hbWUgLiAnLyoucG0nICk7CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0KSB7CgogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBpZiAoICRXZWJzZXJ2ZXJUeXBlID1+IC9eJEZpbGUvaSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6JEZpbGUiOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBuZXcgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAgICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBcnJheVJlZiAmJiByZWYoJEFycmF5UmVmKSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBAeyREYXRhQXJyYXl9LCBAeyRBcnJheVJlZn0gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
cGFja2FnZSBBcmNoaXZlOjpUYXI6OkNvbnN0YW50OwoKQkVHSU4gewogICAgcmVxdWlyZSBFeHBvcnRlcjsKICAgICRWRVJTSU9OPSAnMC4wMic7CiAgICBASVNBICAgID0gcXdbRXhwb3J0ZXJdOwogICAgQEVYUE9SVCA9IHF3WwogICAgICAgICAgICAgICAgRklMRSBIQVJETElOSyBTWU1MSU5LIENIQVJERVYgQkxPQ0tERVYgRElSIEZJRk8gU09DS0VUIFVOS05PV04KICAgICAgICAgICAgICAgIEJVRkZFUiBIRUFEIFJFQURfT05MWSBXUklURV9PTkxZIFVOUEFDSyBQQUNLIFRJTUVfT0ZGU0VUIFpMSUIKICAgICAgICAgICAgICAgIEJMT0NLX1NJWkUgVEFSX1BBRCBUQVJfRU5EIE9OX1VOSVggQkxPQ0sgQ0FOX1JFQURMSU5LIE1BR0lDIAogICAgICAgICAgICAgICAgVEFSX1ZFUlNJT04gVU5BTUUgR05BTUUgQ0FOX0NIT1dOIE1PREUgQ0hFQ0tfU1VNIFVJRCBHSUQgCiAgICAgICAgICAgICAgICBHWklQX01BR0lDX05VTSBNT0RFX1JFQUQgTE9OR0xJTksgTE9OR0xJTktfTkFNRSBQUkVGSVhfTEVOR1RICiAgICAgICAgICAgICAgICBMQUJFTCBOQU1FX0xFTkdUSCBTVFJJUF9NT0RFCiAgICAgICAgICAgIF07CgogICAgcmVxdWlyZSBUaW1lOjpMb2NhbCBpZiAkXk8gZXEgIk1hY09TIjsKfQoKdXNlIGNvbnN0YW50IEZJTEUgICAgICAgICAgID0+IDA7CnVzZSBjb25zdGFudCBIQVJETElOSyAgICAgICA9PiAxOwp1c2UgY29uc3RhbnQgU1lNTElOSyAgICAgICAgPT4gMjsKdXNlIGNvbnN0YW50IENIQVJERVYgICAgICAgID0+IDM7CnVzZSBjb25zdGFudCBCTE9DS0RFViAgICAgICA9PiA0Owp1c2UgY29uc3RhbnQgRElSICAgICAgICAgICAgPT4gNTsKdXNlIGNvbnN0YW50IEZJRk8gICAgICAgICAgID0+IDY7CnVzZSBjb25zdGFudCBTT0NLRVQgICAgICAgICA9PiA4Owp1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgPT4gOTsKdXNlIGNvbnN0YW50IExPTkdMSU5LICAgICAgID0+ICdMJzsKdXNlIGNvbnN0YW50IExBQkVMICAgICAgICAgID0+ICdWJzsKCnVzZSBjb25zdGFudCBCVUZGRVIgICAgICAgICA9PiA0MDk2Owp1c2UgY29uc3RhbnQgSEVBRCAgICAgICAgICAgPT4gNTEyOwp1c2UgY29uc3RhbnQgQkxPQ0sgICAgICAgICAgPT4gNTEyOwoKdXNlIGNvbnN0YW50IEJMT0NLX1NJWkUgICAgID0+IHN1YiB7IG15ICRuID0gaW50KCRfWzBdL0JMT0NLKTsgJG4rKyBpZiAkX1swXSAlIEJMT0NLOyAkbiAqIEJMT0NLIH07CnVzZSBjb25zdGFudCBUQVJfUEFEICAgICAgICA9PiBzdWIgeyBteSAkeCA9IHNoaWZ0IHx8IHJldHVybjsgcmV0dXJuICJcMCIgeCAoQkxPQ0sgLSAoJHggJSBCTE9DSykgKSB9Owp1c2UgY29uc3RhbnQgVEFSX0VORCAgICAgICAgPT4gIlwwIiB4IEJMT0NLOwoKdXNlIGNvbnN0YW50IFJFQURfT05MWSAgICAgID0+IHN1YiB7IHNoaWZ0KCkgPyAncmInIDogJ3InIH07CnVzZSBjb25zdGFudCBXUklURV9PTkxZICAgICA9PiBzdWIgeyAkX1swXSA/ICd3YicgLiBzaGlmdCA6ICd3JyB9Owp1c2UgY29uc3RhbnQgTU9ERV9SRUFEICAgICAgPT4gc3ViIHsgJF9bMF0gPX4gL15yLyA/IDEgOiAwIH07CgojIFBvaW50bGVzcyBhc3NpZ25tZW50IHRvIG1ha2UgLXcgc2h1dCB1cApteSAkZ2V0cHd1aWQ7ICRnZXRwd3VpZCA9ICd1bmtub3duJyB1bmxlc3MgZXZhbCB7IG15ICRmID0gZ2V0cHd1aWQgKDApOyB9OwpteSAkZ2V0Z3JnaWQ7ICRnZXRncmdpZCA9ICd1bmtub3duJyB1bmxlc3MgZXZhbCB7IG15ICRmID0gZ2V0Z3JnaWQgKDApOyB9Owp1c2UgY29uc3RhbnQgVU5BTUUgICAgICAgICAgPT4gc3ViIHsgJGdldHB3dWlkIHx8IHNjYWxhciBnZXRwd3VpZCggc2hpZnQoKSApIHx8ICcnIH07CnVzZSBjb25zdGFudCBHTkFNRSAgICAgICAgICA9PiBzdWIgeyAkZ2V0Z3JnaWQgfHwgc2NhbGFyIGdldGdyZ2lkKCBzaGlmdCgpICkgfHwgJycgfTsKdXNlIGNvbnN0YW50IFVJRCAgICAgICAgICAgID0+ICQ+Owp1c2UgY29uc3RhbnQgR0lEICAgICAgICAgICAgPT4gKHNwbGl0ICcgJywgJCkgKVswXTsKCnVzZSBjb25zdGFudCBNT0RFICAgICAgICAgICA9PiBkbyB7IDA2NjYgJiAoMDc3NyAmIH51bWFzaykgfTsKdXNlIGNvbnN0YW50IFNUUklQX01PREUgICAgID0+IHN1YiB7IHNoaWZ0KCkgJiAwNzc3IH07CnVzZSBjb25zdGFudCBDSEVDS19TVU0gICAgICA9PiAiICAgICAgIjsKCnVzZSBjb25zdGFudCBVTlBBQ0sgICAgICAgICA9PiAnQTEwMCBBOCBBOCBBOCBBMTIgQTEyIEE4IEExIEExMDAgQTYgQTIgQTMyIEEzMiBBOCBBOCBBMTU1IHgxMic7CnVzZSBjb25zdGFudCBQQUNLICAgICAgICAgICA9PiAnYTEwMCBhOCBhOCBhOCBhMTIgYTEyIEE4IGExIGExMDAgYTYgYTIgYTMyIGEzMiBhOCBhOCBhMTU1IHgxMic7CnVzZSBjb25zdGFudCBOQU1FX0xFTkdUSCAgICA9PiAxMDA7CnVzZSBjb25zdGFudCBQUkVGSVhfTEVOR1RIICA9PiAxNTU7Cgp1c2UgY29uc3RhbnQgVElNRV9PRkZTRVQgICAgPT4gKCReTyBlcSAiTWFjT1MiKSA/IFRpbWU6OkxvY2FsOjp0aW1lbG9jYWwoMCwwLDAsMSwwLDcwKSA6IDA7ICAgIAp1c2UgY29uc3RhbnQgTUFHSUMgICAgICAgICAgPT4gInVzdGFyIjsKdXNlIGNvbnN0YW50IFRBUl9WRVJTSU9OICAgID0+ICIwMCI7CnVzZSBjb25zdGFudCBMT05HTElOS19OQU1FICA9PiAnLi8uL0BMb25nTGluayc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIGFsbG93IFpMSUIgdG8gYmUgdHVybmVkIG9mZiB1c2luZyBFTlYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBERUJVRyBvbmx5CnVzZSBjb25zdGFudCBaTElCICAgICAgICAgICA9PiBkbyB7ICEkRU5WeydQRVJMNV9BVF9OT19aTElCJ30gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsIHsgcmVxdWlyZSBJTzo6WmxpYiB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRU5WeydQRVJMNV9BVF9OT19aTElCJ30gfHwgJEAgPyAwIDogMSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKdXNlIGNvbnN0YW50IEdaSVBfTUFHSUNfTlVNID0+IHFyL14oPzpcMDM3XDIxM3xcMDM3XDIzNSkvOwoKdXNlIGNvbnN0YW50IENBTl9DSE9XTiAgICAgID0+IGRvIHsgKCQ+ID09IDAgYW5kICReTyBuZSAiTWFjT1MiIGFuZCAkXk8gbmUgIk1TV2luMzIiKSB9Owp1c2UgY29uc3RhbnQgQ0FOX1JFQURMSU5LICAgPT4gKCReTyBuZSAnTVNXaW4zMicgYW5kICReTyAhfiAvUklTQyg/OlsgX10pP09TL2kgYW5kICReTyBuZSAnVk1TJyk7CnVzZSBjb25zdGFudCBPTl9VTklYICAgICAgICA9PiAoJF5PIG5lICdNU1dpbjMyJyBhbmQgJF5PIG5lICdNYWNPUycgYW5kICReTyBuZSAnVk1TJyk7CgoxOwo=
cGFja2FnZSBBcmNoaXZlOjpUYXI6OkZpbGU7CnVzZSBzdHJpY3Q7Cgp1c2UgSU86OkZpbGU7CnVzZSBGaWxlOjpTcGVjOjpVbml4ICAgICgpOwp1c2UgRmlsZTo6U3BlYyAgICAgICAgICAoKTsKdXNlIEZpbGU6OkJhc2VuYW1lICAgICAgKCk7Cgp1c2UgQXJjaGl2ZTo6VGFyOjpDb25zdGFudDsKCnVzZSB2YXJzIHF3W0BJU0EgJFZFUlNJT05dOwpASVNBICAgICAgICA9IHF3W0FyY2hpdmU6OlRhcl07CiRWRVJTSU9OICAgID0gJzAuMDInOwoKIyMjIHNldCB2YWx1ZSB0byAxIHRvIG9jdCgpIGl0IGR1cmluZyB0aGUgdW5wYWNrICMjIwpteSAkdG1wbCA9IFsKICAgICAgICBuYW1lICAgICAgICA9PiAwLCAgICMgc3RyaW5nCiAgICAgICAgbW9kZSAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgdWlkICAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgZ2lkICAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgc2l6ZSAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgbXRpbWUgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgY2hrc3VtICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgdHlwZSAgICAgICAgPT4gMCwgICAjIGNoYXJhY3RlcgogICAgICAgIGxpbmtuYW1lICAgID0+IDAsICAgIyBzdHJpbmcKICAgICAgICBtYWdpYyAgICAgICA9PiAwLCAgICMgc3RyaW5nCiAgICAgICAgdmVyc2lvbiAgICAgPT4gMCwgICAjIDIgYnl0ZXMKICAgICAgICB1bmFtZSAgICAgICA9PiAwLCAgICMgc3RyaW5nCiAgICAgICAgZ25hbWUgICAgICAgPT4gMCwgICAjIHN0cmluZwogICAgICAgIGRldm1ham9yICAgID0+IDEsICAgIyBvY3RhbAogICAgICAgIGRldm1pbm9yICAgID0+IDEsICAgIyBvY3RhbAogICAgICAgIHByZWZpeCAgICAgID0+IDAsCgojIyMgZW5kIFVOUEFDSyBpdGVtcyAjIyMKICAgICAgICByYXcgICAgICAgICA9PiAwLCAgICMgdGhlIHJhdyBkYXRhIGNodW5rCiAgICAgICAgZGF0YSAgICAgICAgPT4gMCwgICAjIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSAtLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzICBtaWdodCBiZSB2ZXJ5IG1lbW9yeSBpbnRlbnNpdmUKXTsKCiMjIyBpbnN0YWxsIGdldC9zZXQgYWNjZXNzb3JzIGZvciB0aGlzIG9iamVjdC4KZm9yICggbXkgJGk9MDsgJGk8c2NhbGFyIEAkdG1wbCA7ICRpKz0yICkgewogICAgbXkgJGtleSA9ICR0bXBsLT5bJGldOwogICAgbm8gc3RyaWN0ICdyZWZzJzsKICAgICp7X19QQUNLQUdFX18uIjo6JGtleSJ9ID0gc3ViIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgICRzZWxmLT57JGtleX0gPSAkX1swXSBpZiBAXzsKCiAgICAgICAgIyMjIGp1c3QgaW4gY2FzZSB0aGUga2V5IGlzIG5vdCB0aGVyZSBvciB1bmRlZiBvciBzb21ldGhpbmcgIyMjCiAgICAgICAgeyAgIGxvY2FsICReVyA9IDA7CiAgICAgICAgICAgIHJldHVybiAkc2VsZi0+eyRrZXl9OwogICAgICAgIH0KICAgIH0KfQoKPWhlYWQxIE5BTUUKCkFyY2hpdmU6OlRhcjo6RmlsZSAtIGEgc3ViY2xhc3MgZm9yIGluLW1lbW9yeSBleHRyYWN0ZWQgZmlsZSBmcm9tIEFyY2hpdmU6OlRhcgoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgQGl0ZW1zID0gJHRhci0+Z2V0X2ZpbGVzOwoKICAgIHByaW50ICRfLT5uYW1lLCAnICcsICRfLT5zaXplLCAiXG4iIGZvciBAaXRlbXM7CgogICAgcHJpbnQgJG9iamVjdC0+Z2V0X2NvbnRlbnQ7CiAgICAkb2JqZWN0LT5yZXBsYWNlX2NvbnRlbnQoJ25ldyBjb250ZW50Jyk7CgogICAgJG9iamVjdC0+cmVuYW1lKCAnbmV3L2Z1bGwvcGF0aC90by9maWxlLmMnICk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkFyY2hpdmU6OlRhcjo6RmlsZXMgcHJvdmlkZXMgYSBuZWF0IGxpdHRsZSBvYmplY3QgbGF5ZXIgZm9yIGluLW1lbW9yeQpleHRyYWN0ZWQgZmlsZXMuIEl0J3MgbW9zdGx5IHVzZWQgaW50ZXJuYWxseSBpbiBBcmNoaXZlOjpUYXIgdG8gdGlkeQp1cCB0aGUgY29kZSwgYnV0IHRoZXJlJ3Mgbm8gcmVhc29uIHVzZXJzIHNob3VsZG4ndCB1c2UgdGhpcyBBUEkgYXMKd2VsbC4KCj1oZWFkMiBBY2Nlc3NvcnMKCkEgbG90IG9mIHRoZSBtZXRob2RzIGluIHRoaXMgcGFja2FnZSBhcmUgYWNjZXNzb3JzIHRvIHRoZSB2YXJpb3VzCmZpZWxkcyBpbiB0aGUgdGFyIGhlYWRlcjoKCj1vdmVyIDQKCj1pdGVtIG5hbWUKClRoZSBmaWxlJ3MgbmFtZQoKPWl0ZW0gbW9kZQoKVGhlIGZpbGUncyBtb2RlCgo9aXRlbSB1aWQKClRoZSB1c2VyIGlkIG93bmluZyB0aGUgZmlsZQoKPWl0ZW0gZ2lkCgpUaGUgZ3JvdXAgaWQgb3duaW5nIHRoZSBmaWxlCgo9aXRlbSBzaXplCgpGaWxlIHNpemUgaW4gYnl0ZXMKCj1pdGVtIG10aW1lCgpNb2RpZmljYXRpb24gdGltZS4gQWRqdXN0ZWQgdG8gbWFjLXRpbWUgb24gTWFjT1MgaWYgcmVxdWlyZWQKCj1pdGVtIGNoa3N1bQoKQ2hlY2tzdW0gZmllbGQgZm9yIHRoZSB0YXIgaGVhZGVyCgo9aXRlbSB0eXBlCgpGaWxlIHR5cGUgLS0gbnVtZXJpYywgYnV0IGNvbXBhcmFibGUgdG8gZXhwb3J0ZWQgY29uc3RhbnRzIC0tIHNlZQpBcmNoaXZlOjpUYXIncyBkb2N1bWVudGF0aW9uCgo9aXRlbSBsaW5rbmFtZQoKSWYgdGhlIGZpbGUgaXMgYSBzeW1saW5rLCB0aGUgZmlsZSBpdCdzIHBvaW50aW5nIHRvCgo9aXRlbSBtYWdpYwoKVGFyIG1hZ2ljIHN0cmluZyAtLSBub3QgdXNlZnVsIGZvciBtb3N0IHVzZXJzCgo9aXRlbSB2ZXJzaW9uCgpUYXIgdmVyc2lvbiBzdHJpbmcgLS0gbm90IHVzZWZ1bCBmb3IgbW9zdCB1c2VycwoKPWl0ZW0gdW5hbWUKClRoZSB1c2VyIG5hbWUgdGhhdCBvd25zIHRoZSBmaWxlCgo9aXRlbSBnbmFtZQoKVGhlIGdyb3VwIG5hbWUgdGhhdCBvd25zIHRoZSBmaWxlCgo9aXRlbSBkZXZtYWpvcgoKRGV2aWNlIG1ham9yIG51bWJlciBpbiBjYXNlIG9mIGEgc3BlY2lhbCBmaWxlCgo9aXRlbSBkZXZtaW5vcgoKRGV2aWNlIG1pbm9yIG51bWJlciBpbiBjYXNlIG9mIGEgc3BlY2lhbCBmaWxlCgo9aXRlbSBwcmVmaXgKCkFueSBkaXJlY3RvcnkgdG8gcHJlZml4IHRvIHRoZSBleHRyYWN0aW9uIHBhdGgsIGlmIGFueQoKPWl0ZW0gcmF3CgpSYXcgdGFyIGhlYWRlciAtLSBub3QgdXNlZnVsIGZvciBtb3N0IHVzZXJzCgo9YmFjawoKPWhlYWQxIE1ldGhvZHMKCj1oZWFkMiBuZXcoIGZpbGUgPT4gJHBhdGggKQoKUmV0dXJucyBhIG5ldyBBcmNoaXZlOjpUYXI6OkZpbGUgb2JqZWN0IGZyb20gYW4gZXhpc3RpbmcgZmlsZS4KClJldHVybnMgdW5kZWYgb24gZmFpbHVyZS4KCj1oZWFkMiBuZXcoIGRhdGEgPT4gJHBhdGgsICRkYXRhLCAkb3B0ICkKClJldHVybnMgYSBuZXcgQXJjaGl2ZTo6VGFyOjpGaWxlIG9iamVjdCBmcm9tIGRhdGEuCgpDPCRwYXRoPiBkZWZpbmVzIHRoZSBmaWxlIG5hbWUgKHdoaWNoIG5lZWQgbm90IGV4aXN0KSwgQzwkZGF0YT4gdGhlCmZpbGUgY29udGVudHMsIGFuZCBDPCRvcHQ+IGlzIGEgcmVmZXJlbmNlIHRvIGEgaGFzaCBvZiBhdHRyaWJ1dGVzCndoaWNoIG1heSBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgKGZpZWxkcyBpbiB0aGUKdGFyIGhlYWRlciksIHdoaWNoIGFyZSBkZXNjcmliZWQgYWJvdmUgaW4gdGhlIEFjY2Vzc29ycyBzZWN0aW9uLgoKUmV0dXJucyB1bmRlZiBvbiBmYWlsdXJlLgoKPWhlYWQyIG5ldyggY2h1bmsgPT4gJGNodW5rICkKClJldHVybnMgYSBuZXcgQXJjaGl2ZTo6VGFyOjpGaWxlIG9iamVjdCBmcm9tIGEgcmF3IDUxMi1ieXRlIHRhcgphcmNoaXZlIGNodW5rLgoKUmV0dXJucyB1bmRlZiBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgICA9IHNoaWZ0OwogICAgbXkgJHdoYXQgICAgPSBzaGlmdDsKCiAgICBteSAkb2JqID0gICAoJHdoYXQgZXEgJ2NodW5rJykgPyBfX1BBQ0tBR0VfXy0+X25ld19mcm9tX2NodW5rKCBAXyApIDoKICAgICAgICAgICAgICAgICgkd2hhdCBlcSAnZmlsZScgKSA/IF9fUEFDS0FHRV9fLT5fbmV3X2Zyb21fZmlsZSggQF8gKSA6CiAgICAgICAgICAgICAgICAoJHdoYXQgZXEgJ2RhdGEnICkgPyBfX1BBQ0tBR0VfXy0+X25ld19mcm9tX2RhdGEoIEBfICkgOgogICAgICAgICAgICAgICAgdW5kZWY7CgogICAgcmV0dXJuICRvYmo7Cn0KCiMjIyBjb3BpZXMgdGhlIGRhdGEsIGNyZWF0ZXMgYSBjbG9uZSAjIyMKc3ViIGNsb25lIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gYmxlc3MgeyAlJHNlbGYgfSwgcmVmICRzZWxmOwp9CgpzdWIgX25ld19mcm9tX2NodW5rIHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJGNodW5rID0gc2hpZnQgb3IgcmV0dXJuOyAgICAjIDUxMiBieXRlcyBvZiB0YXIgaGVhZGVyCiAgICBteSAlaGFzaCAgPSBAXzsKCiAgICAjIyMgZmlsdGVyIGFueSBhcmd1bWVudHMgb24gZGVmaW5lZC1uZXNzIG9mIHZhbHVlcy4KICAgICMjIyB0aGlzIGFsbG93cyBvdmVycmlkaW5nIGZyb20gd2hhdCB0aGUgdGFyLWhlYWRlciBpcyBzYXlpbmcKICAgICMjIyBhYm91dCB0aGlzIHRhci1lbnRyeS4gUGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgQExvbmdMaW5rIGZpbGVzCiAgICBteSAlYXJncyAgPSBtYXAgeyAkXyA9PiAkaGFzaHskX30gfSBncmVwIHsgZGVmaW5lZCAkaGFzaHskX30gfSBrZXlzICVoYXNoOwoKICAgICMjIyBtYWtlcyBpdCBzdGFydCBhdCAwIGFjdHVhbGx5Li4uIDopICMjIwogICAgbXkgJGkgPSAtMTsKICAgIG15ICVlbnRyeSA9IG1hcCB7CiAgICAgICAgJHRtcGwtPlsrKyRpXSA9PiAkdG1wbC0+WysrJGldID8gb2N0ICRfIDogJF8KICAgIH0gbWFwIHsgL14oW15cMF0qKS8gfSB1bnBhY2soIFVOUEFDSywgJGNodW5rICk7CgogICAgbXkgJG9iaiA9IGJsZXNzIHsgJWVudHJ5LCAlYXJncyB9LCAkY2xhc3M7CgoJIyMjIG1hZ2ljIGlzIGEgZmlsZXR5cGUgc3RyaW5nLi4gaXQgc2hvdWxkIGhhdmUgc29tZXRoaW5nIGxpa2UgJ3VzdGFyJyBvcgoJIyMjIHNvbWV0aGluZyBzaW1pbGFyLi4uIGlmIHRoZSBjaHVuayBpcyBnYXJiYWdlLCBza2lwIGl0CglyZXR1cm4gdW5sZXNzICRvYmotPm1hZ2ljICF+IC9cVy87CgogICAgIyMjIHN0b3JlIHRoZSBvcmlnaW5hbCBjaHVuayAjIyMKICAgICRvYmotPnJhdyggJGNodW5rICk7CgogICAgJG9iai0+dHlwZShGSUxFKSBpZiAoICghbGVuZ3RoICRvYmotPnR5cGUpIG9yICgkb2JqLT50eXBlID1+IC9cVy8pICk7CiAgICAkb2JqLT50eXBlKERJUikgIGlmICggKCRvYmotPmlzX2ZpbGUpICYmICgkb2JqLT5uYW1lID1+IG18LyR8KSApOwoKCiAgICByZXR1cm4gJG9iajsKCn0KCnN1YiBfbmV3X2Zyb21fZmlsZSB7CiAgICBteSAkY2xhc3MgICAgICAgPSBzaGlmdDsKICAgIG15ICRwYXRoICAgICAgICA9IHNoaWZ0OyAgICAgICAgCiAgICAKICAgICMjIyBwYXRoIGhhcyB0byBhdCBsZWFzdCBleGlzdAogICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRwYXRoOwogICAgCiAgICBteSAkdHlwZSAgICAgICAgPSBfX1BBQ0tBR0VfXy0+X2ZpbGV0eXBlKCRwYXRoKTsKICAgIG15ICRkYXRhICAgICAgICA9ICcnOwoKICAgIFJFQUQ6IHsgCiAgICAgICAgdW5sZXNzICgkdHlwZSA9PSBESVIgKSB7CiAgICAgICAgICAgIG15ICRmaCA9IElPOjpGaWxlLT5uZXc7CiAgICAgICAgCiAgICAgICAgICAgIHVubGVzcyggJGZoLT5vcGVuKCRwYXRoKSApIHsKICAgICAgICAgICAgICAgICMjIyBkYW5nbGluZyBzeW1saW5rcyBhcmUgZmluZSwgc3RvcCByZWFkaW5nIGJ1dCBjb250aW51ZQogICAgICAgICAgICAgICAgIyMjIGNyZWF0aW5nIHRoZSBvYmplY3QKICAgICAgICAgICAgICAgIGxhc3QgUkVBRCBpZiAkdHlwZSA9PSBTWU1MSU5LOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAjIyMgb3RoZXJ3aXNlLCByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIC0tCiAgICAgICAgICAgICAgICAjIyMgYW55dGhpbmcgdGhhdCdzICpub3QqIGEgc3ltbGluayBzaG91bGQgYmUKICAgICAgICAgICAgICAgICMjIyByZXNvbHZhYmxlCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyBiaW5tb2RlIG5lZWRlZCB0byByZWFkIGZpbGVzIHByb3Blcmx5IG9uIHdpbjMyICMjIwogICAgICAgICAgICBiaW5tb2RlICRmaDsKICAgICAgICAgICAgJGRhdGEgPSBkbyB7IGxvY2FsICQvOyA8JGZoPiB9OwogICAgICAgICAgICBjbG9zZSAkZmg7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBpdGVtcyAgICAgICA9IHF3W21vZGUgdWlkIGdpZCBzaXplIG10aW1lXTsKICAgIG15ICVoYXNoICAgICAgICA9IG1hcCB7IHNoaWZ0KEBpdGVtcyksICRfIH0gKGxzdGF0ICRwYXRoKVsyLDQsNSw3LDldOwoKICAgICMjIyB5b3UgKm11c3QqIHNldCBzaXplID09IDAgb24gc3ltbGlua3MsIG9yIHRoZSBuZXh0IGVudHJ5IHdpbGwgYmUKICAgICMjIyB0aG91Z2ggb2YgYXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1saW5rLCB3aGljaCBpcyB3cm9uZy4KICAgICMjIyB0aGlzIGZpeGVzIGJ1ZyAjNzkzNwogICAgJGhhc2h7c2l6ZX0gICAgID0gMCBpZiAoJHR5cGUgPT0gRElSIG9yICR0eXBlID09IFNZTUxJTkspOwogICAgJGhhc2h7bXRpbWV9ICAgIC09IFRJTUVfT0ZGU0VUOwoKICAgICMjIyBzdHJpcCB0aGUgaGlnaCBiaXRzIG9mZiB0aGUgbW9kZSwgd2hpY2ggd2UgZG9uJ3QgbmVlZCB0byBzdG9yZQogICAgJGhhc2h7bW9kZX0gICAgID0gU1RSSVBfTU9ERS0+KCAkaGFzaHttb2RlfSApOwoKCiAgICAjIyMgcHJvYmFibHkgcmVxdWlyZXMgc29tZSBmaWxlIHBhdGggbXVuZ2luZyBoZXJlIC4uLiAjIyMKICAgICMjIyBuYW1lIGFuZCBwcmVmaXggYXJlIHNldCBsYXRlcgogICAgbXkgJG9iaiA9IHsKICAgICAgICAlaGFzaCwKICAgICAgICBuYW1lICAgICAgICA9PiAnJywKICAgICAgICBjaGtzdW0gICAgICA9PiBDSEVDS19TVU0sCiAgICAgICAgdHlwZSAgICAgICAgPT4gJHR5cGUsCiAgICAgICAgbGlua25hbWUgICAgPT4gKCR0eXBlID09IFNZTUxJTksgYW5kIENBTl9SRUFETElOSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVhZGxpbmsgJHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJycsCiAgICAgICAgbWFnaWMgICAgICAgPT4gTUFHSUMsCiAgICAgICAgdmVyc2lvbiAgICAgPT4gVEFSX1ZFUlNJT04sCiAgICAgICAgdW5hbWUgICAgICAgPT4gVU5BTUUtPiggJGhhc2h7dWlkfSApLAogICAgICAgIGduYW1lICAgICAgID0+IEdOQU1FLT4oICRoYXNoe2dpZH0gKSwKICAgICAgICBkZXZtYWpvciAgICA9PiAwLCAgICMgbm90IGhhbmRsZWQKICAgICAgICBkZXZtaW5vciAgICA9PiAwLCAgICMgbm90IGhhbmRsZWQKICAgICAgICBwcmVmaXggICAgICA9PiAnJywKICAgICAgICBkYXRhICAgICAgICA9PiAkZGF0YSwKICAgIH07CgogICAgYmxlc3MgJG9iaiwgJGNsYXNzOwoKICAgICMjIyBmaXggdXAgdGhlIHByZWZpeCBhbmQgZmlsZSBmcm9tIHRoZSBwYXRoCiAgICBteSgkcHJlZml4LCRmaWxlKSA9ICRvYmotPl9wcmVmaXhfYW5kX2ZpbGUoICRwYXRoICk7CiAgICAkb2JqLT5wcmVmaXgoICRwcmVmaXggKTsKICAgICRvYmotPm5hbWUoICRmaWxlICk7CgogICAgcmV0dXJuICRvYmo7Cn0KCnN1YiBfbmV3X2Zyb21fZGF0YSB7CiAgICBteSAkY2xhc3MgICA9IHNoaWZ0OwogICAgbXkgJHBhdGggICAgPSBzaGlmdDsgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRwYXRoOwogICAgbXkgJGRhdGEgICAgPSBzaGlmdDsgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRkYXRhOwogICAgbXkgJG9wdCAgICAgPSBzaGlmdDsKCiAgICBteSAkb2JqID0gewogICAgICAgIGRhdGEgICAgICAgID0+ICRkYXRhLAogICAgICAgIG5hbWUgICAgICAgID0+ICcnLAogICAgICAgIG1vZGUgICAgICAgID0+IE1PREUsCiAgICAgICAgdWlkICAgICAgICAgPT4gVUlELAogICAgICAgIGdpZCAgICAgICAgID0+IEdJRCwKICAgICAgICBzaXplICAgICAgICA9PiBsZW5ndGggJGRhdGEsCiAgICAgICAgbXRpbWUgICAgICAgPT4gdGltZSAtIFRJTUVfT0ZGU0VULAogICAgICAgIGNoa3N1bSAgICAgID0+IENIRUNLX1NVTSwKICAgICAgICB0eXBlICAgICAgICA9PiBGSUxFLAogICAgICAgIGxpbmtuYW1lICAgID0+ICcnLAogICAgICAgIG1hZ2ljICAgICAgID0+IE1BR0lDLAogICAgICAgIHZlcnNpb24gICAgID0+IFRBUl9WRVJTSU9OLAogICAgICAgIHVuYW1lICAgICAgID0+IFVOQU1FLT4oIFVJRCApLAogICAgICAgIGduYW1lICAgICAgID0+IEdOQU1FLT4oIEdJRCApLAogICAgICAgIGRldm1pbm9yICAgID0+IDAsCiAgICAgICAgZGV2bWFqb3IgICAgPT4gMCwKICAgICAgICBwcmVmaXggICAgICA9PiAnJywKICAgIH07CgogICAgIyMjIG92ZXJ3cml0ZSB3aXRoIHVzZXIgb3B0aW9ucywgaWYgcHJvdmlkZWQgIyMjCiAgICBpZiggJG9wdCBhbmQgcmVmICRvcHQgZXEgJ0hBU0gnICkgewogICAgICAgIGZvciBteSAka2V5ICgga2V5cyAlJG9wdCApIHsKCiAgICAgICAgICAgICMjIyBkb24ndCB3cml0ZSBib2d1cyBvcHRpb25zICMjIwogICAgICAgICAgICBuZXh0IHVubGVzcyBleGlzdHMgJG9iai0+eyRrZXl9OwogICAgICAgICAgICAkb2JqLT57JGtleX0gPSAkb3B0LT57JGtleX07CiAgICAgICAgfQogICAgfQoKICAgIGJsZXNzICRvYmosICRjbGFzczsKCiAgICAjIyMgZml4IHVwIHRoZSBwcmVmaXggYW5kIGZpbGUgZnJvbSB0aGUgcGF0aAogICAgbXkoJHByZWZpeCwkZmlsZSkgPSAkb2JqLT5fcHJlZml4X2FuZF9maWxlKCAkcGF0aCApOwogICAgJG9iai0+cHJlZml4KCAkcHJlZml4ICk7CiAgICAkb2JqLT5uYW1lKCAkZmlsZSApOwoKICAgIHJldHVybiAkb2JqOwp9CgpzdWIgX3ByZWZpeF9hbmRfZmlsZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHBhdGggPSBzaGlmdDsKCiAgICBteSAoJHZvbCwgJGRpcnMsICRmaWxlKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGgsICRzZWxmLT5pc19kaXIgKTsKICAgIG15IEBkaXJzID0gRmlsZTo6U3BlYy0+c3BsaXRkaXIoICRkaXJzICk7CgogICAgIyMjIHNvIHNvbWV0aW1lcyB0aGUgbGFzdCBlbGVtZW50IGlzICcnIC0tIHByb2JhYmx5IHdoZW4gdHJhaWxpbmcKICAgICMjIyBkaXIgc2xhc2hlcyBhcmUgZW5jb3VudGVyZWQuLi4gdGhpcyBpcyBpcyBvZiBjb3Vyc2UgcG9pbnRsZXNzLAogICAgIyMjIHNvIHJlbW92ZSBpdAogICAgcG9wIEBkaXJzIHdoaWxlIEBkaXJzIGFuZCBub3QgbGVuZ3RoICRkaXJzWy0xXTsKCiAgICAjIyMgaWYgaXQncyBhIGRpcmVjdG9yeSwgdGhlbiAkZmlsZSBtaWdodCBiZSBlbXB0eQogICAgJGZpbGUgPSBwb3AgQGRpcnMgaWYgJHNlbGYtPmlzX2RpciBhbmQgbm90IGxlbmd0aCAkZmlsZTsKCiAgICBteSAkcHJlZml4ID0gRmlsZTo6U3BlYzo6VW5peC0+Y2F0ZGlyKAogICAgICAgICAgICAgICAgICAgICAgICBncmVwIHsgbGVuZ3RoIH0gJHZvbCwgQGRpcnMKICAgICAgICAgICAgICAgICAgICApOwogICAgcmV0dXJuKCAkcHJlZml4LCAkZmlsZSApOwp9CgpzdWIgX2ZpbGV0eXBlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkZmlsZSA9IHNoaWZ0OwogICAgCiAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CgogICAgcmV0dXJuIFNZTUxJTksgIGlmICgtbCAkZmlsZSk7CSMgU3ltbGluawoKICAgIHJldHVybiBGSUxFICAgICBpZiAoLWYgXyk7CQkjIFBsYWluIGZpbGUKCiAgICByZXR1cm4gRElSICAgICAgaWYgKC1kIF8pOwkJIyBEaXJlY3RvcnkKCiAgICByZXR1cm4gRklGTyAgICAgaWYgKC1wIF8pOwkJIyBOYW1lZCBwaXBlCgogICAgcmV0dXJuIFNPQ0tFVCAgIGlmICgtUyBfKTsJCSMgU29ja2V0CgogICAgcmV0dXJuIEJMT0NLREVWIGlmICgtYiBfKTsJCSMgQmxvY2sgc3BlY2lhbAoKICAgIHJldHVybiBDSEFSREVWICBpZiAoLWMgXyk7CQkjIENoYXJhY3RlciBzcGVjaWFsCgogICAgIyMjIHNob3VsZG4ndCBoYXBwZW4sIHRoaXMgaXMgd2hlbiBtYWtpbmcgYXJjaGl2ZXMsIG5vdCByZWFkaW5nICMjIwogICAgcmV0dXJuIExPTkdMSU5LIGlmICggJGZpbGUgZXEgTE9OR0xJTktfTkFNRSApOwoKICAgIHJldHVybiBVTktOT1dOOwkJICAgICAgICAgICAgIyBTb21ldGhpbmcgZWxzZSAobGlrZSB3aGF0PykKCn0KCiMjIyB0aGlzIG1ldGhvZCAnZG93bmdyYWRlcycgYSBmaWxlIHRvIHBsYWluIGZpbGUgLS0gdGhpcyBpcyB1c2VkIGZvcgojIyMgc3ltbGlua3Mgd2hlbiBGT0xMT1dfU1lNTElOS1MgaXMgdHJ1ZS4Kc3ViIF9kb3duZ3JhZGVfdG9fcGxhaW5maWxlIHsKICAgIG15ICRlbnRyeSA9IHNoaWZ0OwogICAgJGVudHJ5LT50eXBlKCBGSUxFICk7CiAgICAkZW50cnktPm1vZGUoIE1PREUgKTsKICAgICRlbnRyeS0+bGlua25hbWUoJycpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgZnVsbF9wYXRoCgpSZXR1cm5zIHRoZSBmdWxsIHBhdGggZnJvbSB0aGUgdGFyIGhlYWRlcjsgdGhpcyBpcyBiYXNpY2FsbHkgYQpjb25jYXRlbmF0aW9uIG9mIHRoZSBDPHByZWZpeD4gYW5kIEM8bmFtZT4gZmllbGRzLgoKPWN1dAoKc3ViIGZ1bGxfcGF0aCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgICMjIyBpZiBwcmVmaXggZmllbGQgaXMgZW10cHkKICAgIHJldHVybiAkc2VsZi0+bmFtZSB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+cHJlZml4IGFuZCBsZW5ndGggJHNlbGYtPnByZWZpeDsKCiAgICAjIyMgb3Igb3RoZXJ3aXNlLCBjYXRmaWxlJ2QKICAgIHJldHVybiBGaWxlOjpTcGVjOjpVbml4LT5jYXRmaWxlKCAkc2VsZi0+cHJlZml4LCAkc2VsZi0+bmFtZSApOwp9CgoKPWhlYWQyIHZhbGlkYXRlCgpEb25lIGJ5IEFyY2hpdmU6OlRhciBpbnRlcm5hbGx5IHdoZW4gcmVhZGluZyB0aGUgdGFyIGZpbGU6CnZhbGlkYXRlIHRoZSBoZWFkZXIgYWdhaW5zdCB0aGUgY2hlY2tzdW0gdG8gZW5zdXJlIGludGVnZXIgdGFyIGZpbGUuCgpSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoKPWN1dAoKc3ViIHZhbGlkYXRlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgbXkgJHJhdyA9ICRzZWxmLT5yYXc7CgogICAgIyMjIGRvbid0IGtub3cgd2h5IHRoaXMgb25lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2UgL3dyaXRlLyAjIyMKICAgIHN1YnN0ciAoJHJhdywgMTQ4LCA4KSA9ICIgICAgICAgICI7CglyZXR1cm4gdW5wYWNrICgiJTE2QyoiLCAkcmF3KSA9PSAkc2VsZi0+Y2hrc3VtID8gMSA6IDA7Cn0KCj1oZWFkMiBoYXNfY29udGVudAoKUmV0dXJucyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgY3VycmVudCBvYmplY3QgaGFzIGNvbnRlbnQuClNvbWUgc3BlY2lhbCBmaWxlcyBsaWtlIGRpcmVjdG9yaWVzIGFuZCBzbyBvbiBuZXZlciB3aWxsIGhhdmUgYW55CmNvbnRlbnQuIFRoaXMgbWV0aG9kIGlzIG1haW5seSB0byBtYWtlIHN1cmUgeW91IGRvbid0IGdldCB3YXJuaW5ncwpmb3IgdXNpbmcgdW5pbml0aWFsaXplZCB2YWx1ZXMgd2hlbiBsb29raW5nIGF0IGFuIG9iamVjdCdzIGNvbnRlbnQuCgo9Y3V0CgpzdWIgaGFzX2NvbnRlbnQgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiBkZWZpbmVkICRzZWxmLT5kYXRhKCkgJiYgbGVuZ3RoICRzZWxmLT5kYXRhKCkgPyAxIDogMDsKfQoKPWhlYWQyIGdldF9jb250ZW50CgpSZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRlbnQgZm9yIHRoZSBpbi1tZW1vcnkgZmlsZQoKPWN1dAoKc3ViIGdldF9jb250ZW50IHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAkc2VsZi0+ZGF0YSggKTsKfQoKPWhlYWQyIGdldF9jb250ZW50X2J5X3JlZgoKUmV0dXJucyB0aGUgY3VycmVudCBjb250ZW50IGZvciB0aGUgaW4tbWVtb3J5IGZpbGUgYXMgYSBzY2FsYXIKcmVmZXJlbmNlLiBOb3JtYWwgdXNlcnMgd29uJ3QgbmVlZCB0aGlzLCBidXQgaXQgd2lsbCBzYXZlIG1lbW9yeSBpZgp5b3UgYXJlIGRlYWxpbmcgd2l0aCB2ZXJ5IGxhcmdlIGRhdGEgZmlsZXMgaW4geW91ciB0YXIgYXJjaGl2ZSwgc2luY2UKaXQgd2lsbCBwYXNzIHRoZSBjb250ZW50cyBieSByZWZlcmVuY2UsIHJhdGhlciB0aGFuIG1ha2UgYSBjb3B5IG9mIGl0CmZpcnN0LgoKPWN1dAoKc3ViIGdldF9jb250ZW50X2J5X3JlZiB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiBcJHNlbGYtPntkYXRhfTsKfQoKPWhlYWQyIHJlcGxhY2VfY29udGVudCggJGNvbnRlbnQgKQoKUmVwbGFjZSB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBmaWxlIHdpdGggdGhlIG5ldyBjb250ZW50LiBUaGlzCm9ubHkgYWZmZWN0cyB0aGUgaW4tbWVtb3J5IGFyY2hpdmUsIG5vdCB0aGUgb24tZGlzayB2ZXJzaW9uIHVudGlsCnlvdSB3cml0ZSBpdC4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIHJlcGxhY2VfY29udGVudCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGRhdGEgPSBzaGlmdCB8fCAnJzsKCiAgICAkc2VsZi0+ZGF0YSggJGRhdGEgKTsKICAgICRzZWxmLT5zaXplKCBsZW5ndGggJGRhdGEgKTsKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgcmVuYW1lKCAkbmV3X25hbWUgKQoKUmVuYW1lIHRoZSBjdXJyZW50IGZpbGUgdG8gJG5ld19uYW1lLgoKTm90ZSB0aGF0IHlvdSBtdXN0IHNwZWNpZnkgYSBVbml4IHBhdGggZm9yICRuZXdfbmFtZSwgc2luY2UgcGVyIHRhcgpzdGFuZGFyZCwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlIG11c3QgYmUgVW5peCBwYXRocy4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIHJlbmFtZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHBhdGggPSBzaGlmdDsKICAgIAogICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRwYXRoOwoKICAgIG15ICgkcHJlZml4LCRmaWxlKSA9ICRzZWxmLT5fcHJlZml4X2FuZF9maWxlKCAkcGF0aCApOwoKICAgICRzZWxmLT5uYW1lKCAkZmlsZSApOwogICAgJHNlbGYtPnByZWZpeCggJHByZWZpeCApOwoKCXJldHVybiAxOwp9Cgo9aGVhZDEgQ29udmVuaWVuY2UgbWV0aG9kcwoKVG8gcXVpY2tseSBjaGVjayB0aGUgdHlwZSBvZiBhIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3QsIHlvdSBjYW4KdXNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKCj1vdmVyIDQKCj1pdGVtIGlzX2ZpbGUKClJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBvZiB0eXBlIEM8ZmlsZT4KCj1pdGVtIGlzX2RpcgoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxkaXI+Cgo9aXRlbSBpc19oYXJkbGluawoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxoYXJkbGluaz4KCj1pdGVtIGlzX3N5bWxpbmsKClJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBvZiB0eXBlIEM8c3ltbGluaz4KCj1pdGVtIGlzX2NoYXJkZXYKClJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBvZiB0eXBlIEM8Y2hhcmRldj4KCj1pdGVtIGlzX2Jsb2NrZGV2CgpSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgb2YgdHlwZSBDPGJsb2NrZGV2PgoKPWl0ZW0gaXNfZmlmbwoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxmaWZvPgoKPWl0ZW0gaXNfc29ja2V0CgpSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgb2YgdHlwZSBDPHNvY2tldD4KCj1pdGVtIGlzX2xvbmdsaW5rCgpSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgb2YgdHlwZSBDPExvbmdMaW5rPi4KU2hvdWxkIG5vdCBoYXBwZW4gYWZ0ZXIgYSBzdWNjZXNzZnVsIEM8cmVhZD4uCgo9aXRlbSBpc19sYWJlbAoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxMYWJlbD4uClNob3VsZCBub3QgaGFwcGVuIGFmdGVyIGEgc3VjY2Vzc2Z1bCBDPHJlYWQ+LgoKPWl0ZW0gaXNfdW5rbm93bgoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIHR5cGUgaXMgQzx1bmtub3duPgoKPWJhY2sKCj1jdXQKCiNzdHVwaWQgcGVybDUuNS4zIG5lZWRzIHRvIHdhcm4gaWYgaXQncyBub3QgbnVtZXJpYwpzdWIgaXNfZmlsZSAgICAgeyBsb2NhbCAkXlc7ICAgIEZJTEUgICAgICA9PSAkX1swXS0+dHlwZSB9CnN1YiBpc19kaXIgICAgICB7IGxvY2FsICReVzsgICAgRElSICAgICAgID09ICRfWzBdLT50eXBlIH0Kc3ViIGlzX2hhcmRsaW5rIHsgbG9jYWwgJF5XOyAgICBIQVJETElOSyAgPT0gJF9bMF0tPnR5cGUgfQpzdWIgaXNfc3ltbGluayAgeyBsb2NhbCAkXlc7ICAgIFNZTUxJTksgICA9PSAkX1swXS0+dHlwZSB9CnN1YiBpc19jaGFyZGV2ICB7IGxvY2FsICReVzsgICAgQ0hBUkRFViAgID09ICRfWzBdLT50eXBlIH0Kc3ViIGlzX2Jsb2NrZGV2IHsgbG9jYWwgJF5XOyAgICBCTE9DS0RFViAgPT0gJF9bMF0tPnR5cGUgfQpzdWIgaXNfZmlmbyAgICAgeyBsb2NhbCAkXlc7ICAgIEZJRk8gICAgICA9PSAkX1swXS0+dHlwZSB9CnN1YiBpc19zb2NrZXQgICB7IGxvY2FsICReVzsgICAgU09DS0VUICAgID09ICRfWzBdLT50eXBlIH0Kc3ViIGlzX3Vua25vd24gIHsgbG9jYWwgJF5XOyAgICBVTktOT1dOICAgPT0gJF9bMF0tPnR5cGUgfQpzdWIgaXNfbG9uZ2xpbmsgeyBsb2NhbCAkXlc7ICAgIExPTkdMSU5LICBlcSAkX1swXS0+dHlwZSB9CnN1YiBpc19sYWJlbCAgICB7IGxvY2FsICReVzsgICAgTEFCRUwgICAgIGVxICRfWzBdLT50eXBlIH0KCjE7Cg==
IyMjIHRoZSBnbnUgdGFyIHNwZWNpZmljYXRpb246CiMjIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGFyL21hbnVhbC90YXIuaHRtbAojIyMKIyMjIGFuZCB0aGUgcGF4IGZvcm1hdCBzcGVjLCB3aGljaCB0YXIgZGVyaXZlcyBmcm9tOgojIyMgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9wYXguaHRtbAoKcGFja2FnZSBBcmNoaXZlOjpUYXI7CnJlcXVpcmUgNS4wMDVfMDM7Cgp1c2Ugc3RyaWN0Owp1c2UgdmFycyBxd1skREVCVUcgJGVycm9yICRWRVJTSU9OICRXQVJOICRGT0xMT1dfU1lNTElOSyAkQ0hPV04gJENITU9ECiAgICAgICAgICAgICRET19OT1RfVVNFX1BSRUZJWCAkSEFTX1BFUkxJTyAkSEFTX0lPX1NUUklOR107CgokREVCVUcgICAgICAgICAgICAgID0gMDsKJFdBUk4gICAgICAgICAgICAgICA9IDE7CiRGT0xMT1dfU1lNTElOSyAgICAgPSAwOwokVkVSU0lPTiAgICAgICAgICAgID0gIjEuMzQiOwokQ0hPV04gICAgICAgICAgICAgID0gMTsKJENITU9EICAgICAgICAgICAgICA9IDE7CiRET19OT1RfVVNFX1BSRUZJWCAgPSAwOwoKQkVHSU4gewogICAgdXNlIENvbmZpZzsKICAgICRIQVNfUEVSTElPID0gJENvbmZpZzo6Q29uZmlne3VzZXBlcmxpb307CgogICAgIyMjIHRyeSBhbmQgbG9hZCBJTzo6U3RyaW5nIGFueXdheSwgc28geW91IGNhbiBkeW5hbWljYWxseQogICAgIyMjIHN3aXRjaCBiZXR3ZWVuIHBlcmxpbyBhbmQgSU86OlN0cmluZwogICAgZXZhbCB7CiAgICAgICAgcmVxdWlyZSBJTzo6U3RyaW5nOwogICAgICAgIGltcG9ydCBJTzo6U3RyaW5nOwogICAgfTsKICAgICRIQVNfSU9fU1RSSU5HID0gJEAgPyAwIDogMTsKCn0KCnVzZSBDd2Q7CnVzZSBJTzo6RmlsZTsKdXNlIENhcnAgICAgICAgICAgICAgICAgcXcoY2FycCBjcm9hayk7CnVzZSBGaWxlOjpTcGVjICAgICAgICAgICgpOwp1c2UgRmlsZTo6U3BlYzo6VW5peCAgICAoKTsKdXNlIEZpbGU6OlBhdGggICAgICAgICAgKCk7Cgp1c2UgQXJjaGl2ZTo6VGFyOjpGaWxlOwp1c2UgQXJjaGl2ZTo6VGFyOjpDb25zdGFudDsKCj1oZWFkMSBOQU1FCgpBcmNoaXZlOjpUYXIgLSBtb2R1bGUgZm9yIG1hbmlwdWxhdGlvbnMgb2YgdGFyIGFyY2hpdmVzCgo9aGVhZDEgU1lOT1BTSVMKCiAgICB1c2UgQXJjaGl2ZTo6VGFyOwogICAgbXkgJHRhciA9IEFyY2hpdmU6OlRhci0+bmV3OwoKICAgICR0YXItPnJlYWQoJ29yaWdpbi50Z3onLDEpOwogICAgJHRhci0+ZXh0cmFjdCgpOwoKICAgICR0YXItPmFkZF9maWxlcygnZmlsZS9mb28ucGwnLCAnZG9jcy9SRUFETUUnKTsKICAgICR0YXItPmFkZF9kYXRhKCdmaWxlL2Jhei50eHQnLCAnVGhpcyBpcyB0aGUgY29udGVudHMgbm93Jyk7CgogICAgJHRhci0+cmVuYW1lKCdvbGRuYW1lJywgJ25ldy9maWxlL25hbWUnKTsKCiAgICAkdGFyLT53cml0ZSgnZmlsZXMudGFyJyk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkFyY2hpdmU6OlRhciBwcm92aWRlcyBhbiBvYmplY3Qgb3JpZW50ZWQgbWVjaGFuaXNtIGZvciBoYW5kbGluZyB0YXIKZmlsZXMuICBJdCBwcm92aWRlcyBjbGFzcyBtZXRob2RzIGZvciBxdWljayBhbmQgZWFzeSBmaWxlcyBoYW5kbGluZwp3aGlsZSBhbHNvIGFsbG93aW5nIGZvciB0aGUgY3JlYXRpb24gb2YgdGFyIGZpbGUgb2JqZWN0cyBmb3IgY3VzdG9tCm1hbmlwdWxhdGlvbi4gIElmIHlvdSBoYXZlIHRoZSBJTzo6WmxpYiBtb2R1bGUgaW5zdGFsbGVkLApBcmNoaXZlOjpUYXIgd2lsbCBhbHNvIHN1cHBvcnQgY29tcHJlc3NlZCBvciBnemlwcGVkIHRhciBmaWxlcy4KCkFuIG9iamVjdCBvZiBjbGFzcyBBcmNoaXZlOjpUYXIgcmVwcmVzZW50cyBhIC50YXIoLmd6KSBhcmNoaXZlIGZ1bGwKb2YgZmlsZXMgYW5kIHRoaW5ncy4KCj1oZWFkMSBPYmplY3QgTWV0aG9kcwoKPWhlYWQyIEFyY2hpdmU6OlRhci0+bmV3KCBbJGZpbGUsICRjb21wcmVzc2VkXSApCgpSZXR1cm5zIGEgbmV3IFRhciBvYmplY3QuIElmIGdpdmVuIGFueSBhcmd1bWVudHMsIEM8bmV3KCk+IGNhbGxzIHRoZQpDPHJlYWQoKT4gbWV0aG9kIGF1dG9tYXRpY2FsbHksIHBhc3Npbmcgb24gdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0bwp0aGUgQzxyZWFkKCk+IG1ldGhvZC4KCklmIEM8bmV3KCk+IGlzIGludm9rZWQgd2l0aCBhcmd1bWVudHMgYW5kIHRoZSBDPHJlYWQoKT4gbWV0aG9kIGZhaWxzCmZvciBhbnkgcmVhc29uLCBDPG5ldygpPiByZXR1cm5zIHVuZGVmLgoKPWN1dAoKbXkgJHRtcGwgPSB7CiAgICBfZGF0YSAgID0+IFsgXSwKICAgIF9maWxlICAgPT4gJ1Vua25vd24nLAp9OwoKIyMjIGluc3RhbGwgZ2V0L3NldCBhY2Nlc3NvcnMgZm9yIHRoaXMgb2JqZWN0Lgpmb3IgbXkgJGtleSAoIGtleXMgJSR0bXBsICkgewogICAgbm8gc3RyaWN0ICdyZWZzJzsKICAgICp7X19QQUNLQUdFX18uIjo6JGtleSJ9ID0gc3ViIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgICRzZWxmLT57JGtleX0gPSAkX1swXSBpZiBAXzsKICAgICAgICByZXR1cm4gJHNlbGYtPnska2V5fTsKICAgIH0KfQoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgICRjbGFzcyA9IHJlZiAkY2xhc3MgaWYgcmVmICRjbGFzczsKCiAgICAjIyMgY29weWluZyAkdG1wbCBoZXJlIHNpbmNlIGEgc2hhbGxvdyBjb3B5IG1ha2VzIGl0IHVzZSB0aGUKICAgICMjIyBzYW1lIGFyZWYsIGNhdXNpbmcgZm9yIGZpbGVzIHRvIHJlbWFpbiBpbiBtZW1vcnkgYWx3YXlzLgogICAgbXkgJG9iaiA9IGJsZXNzIHsgX2RhdGEgPT4gWyBdLCBfZmlsZSA9PiAnVW5rbm93bicgfSwgJGNsYXNzOwoKICAgIGlmIChAXykgewogICAgICAgIHVubGVzcyAoICRvYmotPnJlYWQoIEBfICkgKSB7CiAgICAgICAgICAgICRvYmotPl9lcnJvcihxcVtObyBkYXRhIGNvdWxkIGJlIHJlYWQgZnJvbSBmaWxlXSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRvYmo7Cn0KCj1oZWFkMiAkdGFyLT5yZWFkICggJGZpbGVuYW1lfCRoYW5kbGUsICRjb21wcmVzc2VkLCB7b3B0ID0+ICd2YWwnfSApCgpSZWFkIHRoZSBnaXZlbiB0YXIgZmlsZSBpbnRvIG1lbW9yeS4KVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgdGhlIG5hbWUgb2YgYSBmaWxlIG9yIGEgcmVmZXJlbmNlIHRvCmFuIGFscmVhZHkgb3BlbiBmaWxlaGFuZGxlIChvciBhbiBJTzo6WmxpYiBvYmplY3QgaWYgaXQncyBjb21wcmVzc2VkKQpUaGUgc2Vjb25kIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlIHJlZmVyZW5jZWQgYnkgdGhlIGZpcnN0CmFyZ3VtZW50IGlzIGNvbXByZXNzZWQuCgpUaGUgQzxyZWFkPiB3aWxsIEk8cmVwbGFjZT4gYW55IHByZXZpb3VzIGNvbnRlbnQgaW4gQzwkdGFyPiEKClRoZSBzZWNvbmQgYXJndW1lbnQgbWF5IGJlIGNvbnNpZGVyZWQgb3B0aW9uYWwgaWYgSU86OlpsaWIgaXMKaW5zdGFsbGVkLCBzaW5jZSBpdCB3aWxsIHRyYW5zcGFyZW50bHkgRG8gVGhlIFJpZ2h0IFRoaW5nLgpBcmNoaXZlOjpUYXIgd2lsbCB3YXJuIGlmIHlvdSB0cnkgdG8gcGFzcyBhIGNvbXByZXNzZWQgZmlsZSBpZgpJTzo6WmxpYiBpcyBub3QgYXZhaWxhYmxlIGFuZCBzaW1wbHkgcmV0dXJuLgoKTm90ZSB0aGF0IHlvdSBjYW4gY3VycmVudGx5IEI8bm90PiBwYXNzIGEgQzxnemlwPiBjb21wcmVzc2VkCmZpbGVoYW5kbGUsIHdoaWNoIGlzIG5vdCBvcGVuZWQgd2l0aCBDPElPOjpabGliPiwgbm9yIGEgc3RyaW5nCmNvbnRhaW5pbmcgdGhlIGZ1bGwgYXJjaGl2ZSBpbmZvcm1hdGlvbiAoZWl0aGVyIGNvbXByZXNzZWQgb3IKdW5jb21wcmVzc2VkKS4gVGhlc2UgYXJlIHdvcnRoIHdoaWxlIGZlYXR1cmVzLCBidXQgbm90IGN1cnJlbnRseQppbXBsZW1lbnRlZC4gU2VlIHRoZSBDPFRPRE8+IHNlY3Rpb24uCgpUaGUgdGhpcmQgYXJndW1lbnQgY2FuIGJlIGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBvcHRpb25zLiBOb3RlIHRoYXQKYWxsIG9wdGlvbnMgYXJlIGNhc2Utc2Vuc2l0aXZlLgoKPW92ZXIgNAoKPWl0ZW0gbGltaXQKCkRvIG5vdCByZWFkIG1vcmUgdGhhbiBDPGxpbWl0PiBmaWxlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUKdmVyeSBiaWcgYXJjaGl2ZXMsIGFuZCBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCBmZXcgZmlsZXMuCgo9aXRlbSBleHRyYWN0CgpJZiBzZXQgdG8gdHJ1ZSwgaW1tZWRpYXRlbHkgZXh0cmFjdCBlbnRyaWVzIHdoZW4gcmVhZGluZyB0aGVtLiBUaGlzCmdpdmVzIHlvdSB0aGUgc2FtZSBtZW1vcnkgYnJlYWsgYXMgdGhlIEM8ZXh0cmFjdF9hcmNoaXZlPiBmdW5jdGlvbi4KTm90ZSBob3dldmVyIHRoYXQgZW50cmllcyB3aWxsIG5vdCBiZSByZWFkIGludG8gbWVtb3J5LCBidXQgd3JpdHRlbgpzdHJhaWdodCB0byBkaXNrLgoKPWJhY2sKCkFsbCBmaWxlcyBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IG9iamVjdHMuClBsZWFzZSBjb25zdWx0IHRoZSBMPEFyY2hpdmU6OlRhcjo6RmlsZT4gZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KClJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlcyByZWFkIGluIHNjYWxhciBjb250ZXh0LCBhbmQgYSBsaXN0IG9mCkM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3RzIGluIGxpc3QgY29udGV4dC4KCj1jdXQKCnN1YiByZWFkIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkZmlsZSA9IHNoaWZ0OwogICAgbXkgJGd6aXAgPSBzaGlmdCB8fCAwOwogICAgbXkgJG9wdHMgPSBzaGlmdCB8fCB7fTsKCiAgICB1bmxlc3MoIGRlZmluZWQgJGZpbGUgKSB7CiAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbTm8gZmlsZSB0byByZWFkIGZyb20hXSApOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgJHNlbGYtPl9maWxlKCAkZmlsZSApOwogICAgfQoKICAgIG15ICRoYW5kbGUgPSAkc2VsZi0+X2dldF9oYW5kbGUoJGZpbGUsICRnemlwLCBSRUFEX09OTFktPiggWkxJQiApICkKICAgICAgICAgICAgICAgICAgICBvciByZXR1cm47CgogICAgbXkgJGRhdGEgPSAkc2VsZi0+X3JlYWRfdGFyKCAkaGFuZGxlLCAkb3B0cyApIG9yIHJldHVybjsKCiAgICAkc2VsZi0+X2RhdGEoICRkYXRhICk7CgogICAgcmV0dXJuIHdhbnRhcnJheSA/IEAkZGF0YSA6IHNjYWxhciBAJGRhdGE7Cn0KCnN1YiBfZ2V0X2hhbmRsZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZSBpZiByZWYgJGZpbGU7CgogICAgbXkgJGd6aXAgPSBzaGlmdCB8fCAwOwogICAgbXkgJG1vZGUgPSBzaGlmdCB8fCBSRUFEX09OTFktPiggWkxJQiApOyAjIGRlZmF1bHQgdG8gcmVhZCBvbmx5CgogICAgbXkgJGZoOyBteSAkYmluOwoKICAgICMjIyBvbmx5IGRlZmF1bHQgdG8gWkxJQiBpZiB3ZSdyZSBub3QgdHJ5aW5nIHRvIC93cml0ZS8gdG8gYSBoYW5kbGUgIyMjCiAgICBpZiggWkxJQiBhbmQgJGd6aXAgfHwgTU9ERV9SRUFELT4oICRtb2RlICkgKSB7CgogICAgICAgICMjIyBJTzo6WmxpYiB3aWxsIERvIFRoZSBSaWdodCBUaGluZywgZXZlbiB3aGVuIHBhc3NlZAogICAgICAgICMjIyBhIHBsYWluIGZpbGUgIyMjCiAgICAgICAgJGZoID0gbmV3IElPOjpabGliOwoKICAgIH0gZWxzZSB7CiAgICAgICAgaWYoICRnemlwICkgewogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKHFxW0NvbXByZXNzaW9uIG5vdCBhdmFpbGFibGUgLSBJbnN0YWxsIElPOjpabGliIV0pOwogICAgICAgICAgICByZXR1cm47CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRmaCA9IG5ldyBJTzo6RmlsZTsKICAgICAgICAgICAgJGJpbisrOwogICAgICAgIH0KICAgIH0KCiAgICB1bmxlc3MoICRmaC0+b3BlbiggJGZpbGUsICRtb2RlICkgKSB7CiAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IGNyZWF0ZSBmaWxlaGFuZGxlIGZvciAnJGZpbGUnOiAkISFdICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGJpbm1vZGUgJGZoIGlmICRiaW47CgogICAgcmV0dXJuICRmaDsKfQoKc3ViIF9yZWFkX3RhciB7CiAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJGhhbmRsZSAgPSBzaGlmdCBvciByZXR1cm47CiAgICBteSAkb3B0cyAgICA9IHNoaWZ0IHx8IHt9OwoKICAgIG15ICRjb3VudCAgID0gJG9wdHMtPntsaW1pdH0gICAgfHwgMDsKICAgIG15ICRleHRyYWN0ID0gJG9wdHMtPntleHRyYWN0fSAgfHwgMDsKCiAgICAjIyMgc2V0IGEgY2FwIG9uIHRoZSBhbW91bnQgb2YgZmlsZXMgdG8gZXh0cmFjdCAjIyMKICAgIG15ICRsaW1pdCAgID0gMDsKICAgICRsaW1pdCA9IDEgaWYgJGNvdW50ID4gMDsKCiAgICBteSAkdGFyZmlsZSA9IFsgXTsKICAgIG15ICRjaHVuazsKICAgIG15ICRyZWFkID0gMDsKICAgIG15ICRyZWFsX25hbWU7ICAjIHRvIHNldCB0aGUgbmFtZSBvZiBhIGZpbGUgd2hlbgogICAgICAgICAgICAgICAgICAgICMgd2UncmUgZW5jb3VudGVyaW5nIEBsb25nbGluawogICAgbXkgJGRhdGE7CgogICAgTE9PUDoKICAgIHdoaWxlKCAkaGFuZGxlLT5yZWFkKCAkY2h1bmssIEhFQUQgKSApIHsKICAgICAgICAjIyMgSU86OlpsaWIgZG9lc24ndCBzdXBwb3J0IHRoaXMgeWV0CiAgICAgICAgbXkgJG9mZnNldCA9IGV2YWwgeyB0ZWxsICRoYW5kbGUgfSB8fCAndW5rbm93bic7CgogICAgICAgIHVubGVzcyggJHJlYWQrKyApIHsKICAgICAgICAgICAgbXkgJGd6aXAgPSBHWklQX01BR0lDX05VTTsKICAgICAgICAgICAgaWYoICRjaHVuayA9fiAvJGd6aXAvICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ2Fubm90IHJlYWQgY29tcHJlc3NlZCBmb3JtYXQgaW4gdGFyLW1vZGVdICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMjIyBpZiB3ZSBjYW4ndCByZWFkIGluIGFsbCBieXRlcy4uLiAjIyMKICAgICAgICBsYXN0IGlmIGxlbmd0aCAkY2h1bmsgIT0gSEVBRDsKCiAgICAgICAgIyMjIEFwcGFyZW50bHkgdGhpcyBzaG91bGQgcmVhbGx5IGJlIHR3byBibG9ja3Mgb2YgNTEyIHplcm9lcywKICAgICAgICAjIyMgYnV0IEdOVSB0YXIgc29tZXRpbWVzIGdldHMgaXQgd3JvbmcuIFNlZSBjb21tZW50IGluIHRoZQogICAgICAgICMjIyBzb3VyY2UgY29kZSAodGFyLmMpIHRvIEdOVSBjcGlvLgogICAgICAgIG5leHQgaWYgJGNodW5rIGVxIFRBUl9FTkQ7CgogICAgICAgICMjIyBhY2NvcmRpbmcgdG8gdGhlIHBvc2l4IHNwZWMsIHRoZSBsYXN0IDEyIGJ5dGVzIG9mIHRoZSBoZWFkZXIgYXJlCiAgICAgICAgIyMjIG51bGwgYnl0ZXMsIHRvIHBhZCBpdCB0byBhIDUxMiBieXRlIGJsb2NrLiBUaGF0IG1lYW5zIGlmIHRoZXNlCiAgICAgICAgIyMjIGJ5dGVzIGFyZSBOT1QgbnVsbCBieXRlcywgaXQncyBhIGNvcnJydXB0IGhlYWRlci4gU2VlOgogICAgICAgICMjIyB3d3cua29kZXJzLmNvbS9jL2ZpZENFNDczQUQzRDlGODM1RDY5MDI1OUQ2MEFENTY1NDU5MUQ5MUQ1QkEuYXNweAogICAgICAgICMjIyBsaW5lIDExMQogICAgICAgIHsgICBteSAkbnVsbHMgPSBqb2luICcnLCAiXDAiIHggMTI7CiAgICAgICAgICAgIHVubGVzcyggJG51bGxzIGVxIHN1YnN0ciggJGNodW5rLCA1MDAsIDEyICkgKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtJbnZhbGlkIGhlYWRlciBibG9jayBhdCBvZmZzZXQgJG9mZnNldF0gKTsKICAgICAgICAgICAgICAgIG5leHQgTE9PUDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyMjIHBhc3MgdGhlIHJlYWxuYW1lLCBzbyB3ZSBjYW4gc2V0IGl0ICdwcm9wZXInIHJpZ2h0IGF3YXkKICAgICAgICAjIyMgc29tZSBvZiB0aGUgaGV1cmlzdGljcyBhcmUgZG9uZSBvbiB0aGUgbmFtZSwgc28gaW1wb3J0YW50CiAgICAgICAgIyMjIHRvIHNldCBpdCBBU0FQCiAgICAgICAgbXkgJGVudHJ5OwogICAgICAgIHsgICBteSAlZXh0cmFfYXJncyA9ICgpOwogICAgICAgICAgICAkZXh0cmFfYXJnc3snbmFtZSd9ID0gJCRyZWFsX25hbWUgaWYgZGVmaW5lZCAkcmVhbF9uYW1lOwogICAgICAgICAgICAKICAgICAgICAgICAgdW5sZXNzKCAkZW50cnkgPSBBcmNoaXZlOjpUYXI6OkZpbGUtPm5ldyggICBjaHVuayA9PiAkY2h1bmssIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVleHRyYV9hcmdzICkgCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGRuJ3QgcmVhZCBjaHVuayBhdCBvZmZzZXQgJG9mZnNldF0gKTsKICAgICAgICAgICAgICAgIG5leHQgTE9PUDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyMjIGlnbm9yZSBsYWJlbHM6CiAgICAgICAgIyMjIGh0dHA6Ly93d3cuZ251Lm9yZy9tYW51YWwvdGFyL2h0bWxfbm9kZS90YXJfMTM5Lmh0bWwKICAgICAgICBuZXh0IGlmICRlbnRyeS0+aXNfbGFiZWw7CgogICAgICAgIGlmKCBsZW5ndGggJGVudHJ5LT50eXBlIGFuZCAoJGVudHJ5LT5pc19maWxlIHx8ICRlbnRyeS0+aXNfbG9uZ2xpbmspICkgewoKICAgICAgICAgICAgaWYgKCAkZW50cnktPmlzX2ZpbGUgJiYgISRlbnRyeS0+dmFsaWRhdGUgKSB7CiAgICAgICAgICAgICAgICAjIyMgc29tZXRpbWVzIHRoZSBjaHVuayBpcyByYXRoZXIgZnV4MHIzZCBhbmQgYSB3aG9sZSA1MTIKICAgICAgICAgICAgICAgICMjIyBieXRlcyBlbmRzIHVwIGluIHRoZSAtPm5hbWUgYXJlYS4KICAgICAgICAgICAgICAgICMjIyBjbGVhbiBpdCB1cCwgaWYgbmVlZCBiZQogICAgICAgICAgICAgICAgbXkgJG5hbWUgPSAkZW50cnktPm5hbWU7CiAgICAgICAgICAgICAgICAkbmFtZSA9IHN1YnN0cigkbmFtZSwgMCwgMTAwKSBpZiBsZW5ndGggJG5hbWUgPiAxMDA7CiAgICAgICAgICAgICAgICAkbmFtZSA9fiBzL1xuLyAvZzsKCiAgICAgICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCAkbmFtZSAuIHFxWzogY2hlY2tzdW0gZXJyb3JdICk7CiAgICAgICAgICAgICAgICBuZXh0IExPT1A7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRibG9jayA9IEJMT0NLX1NJWkUtPiggJGVudHJ5LT5zaXplICk7CgogICAgICAgICAgICAkZGF0YSA9ICRlbnRyeS0+Z2V0X2NvbnRlbnRfYnlfcmVmOwoKICAgICAgICAgICAgIyMjIGp1c3QgcmVhZCBldmVyeXRoaW5nIGludG8gbWVtb3J5CiAgICAgICAgICAgICMjIyBjYW4ndCBkbyBsYXp5IGxvYWRpbmcgc2luY2UgSU86OlpsaWIgZG9lc24ndCBzdXBwb3J0ICdzZWVrJwogICAgICAgICAgICAjIyMgdGhpcyBpcyBiZWNhdXNlIENvbXByZXNzOjpabGliIGRvZXNuJ3Qgc3VwcG9ydCBpdCA9LwogICAgICAgICAgICAjIyMgdGhpcyByZWFkcyBpbiB0aGUgd2hvbGUgZGF0YSBpbiBvbmUgcmVhZCgpIGNhbGwuCiAgICAgICAgICAgIGlmKCAkaGFuZGxlLT5yZWFkKCAkJGRhdGEsICRibG9jayApIDwgJGJsb2NrICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbUmVhZCBlcnJvciBvbiB0YXJmaWxlIChtaXNzaW5nIGRhdGEpICddLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW50cnktPmZ1bGxfcGF0aCAuIicgYXQgb2Zmc2V0ICRvZmZzZXQiICk7CiAgICAgICAgICAgICAgICBuZXh0IExPT1A7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyB0aHJvdyBhd2F5IHRyYWlsaW5nIGdhcmJhZ2UgIyMjCiAgICAgICAgICAgIHN1YnN0ciAoJCRkYXRhLCAkZW50cnktPnNpemUpID0gIiIgaWYgZGVmaW5lZCAkJGRhdGE7CgogICAgICAgICAgICAjIyMgcGFydCBJSSBvZiB0aGUgQExvbmdMaW5rIG11bmdpbmcgLS0gbmVlZCB0byBkbyAvYWZ0ZXIvCiAgICAgICAgICAgICMjIyB0aGUgY2hlY2tzdW0gY2hlY2suCiAgICAgICAgICAgIGlmKCAkZW50cnktPmlzX2xvbmdsaW5rICkgewogICAgICAgICAgICAgICAgIyMjIHdlaXJkIHRoaW5nIGluIHRhcmZpbGVzIC0tIGlmIHRoZSBmaWxlIGlzIGFjdHVhbGx5IGEKICAgICAgICAgICAgICAgICMjIyBATG9uZ0xpbmssIHRoZSBkYXRhIHBhcnQgc2VlbXMgdG8gaGF2ZSBhIHRyYWlsaW5nIF5ACiAgICAgICAgICAgICAgICAjIyMgKHVucHJpbnRhYmxlKSBjaGFyLiB0byBkaXNwbGF5LCBwaXBlIG91dHB1dCB0aHJvdWdoIGxlc3MuCiAgICAgICAgICAgICAgICAjIyMgYnV0IHRoYXQgZG9lc24ndCAqYWx3YXlzKiBoYXBwZW4uLiBzbyBjaGVjayBpZiB0aGUgbGFzdAogICAgICAgICAgICAgICAgIyMjIGNoYXJhY3RlciBpcyBhIGNvbnRyb2wgY2hhcmFjdGVyLCBhbmQgaWYgc28gcmVtb3ZlIGl0CiAgICAgICAgICAgICAgICAjIyMgYXQgYW55IHJhdGUsIHdlIGJldHRlciByZW1vdmUgdGhhdCBjaGFyYWN0ZXIgaGVyZSwgb3IgdGVzdHMKICAgICAgICAgICAgICAgICMjIyBsaWtlICdlcScgYW5kIGhhc2hsb29rIHVwcyBiYXNlZCBvbiBuYW1lcyB3aWxsIFNPIG5vdCB3b3JrCiAgICAgICAgICAgICAgICAjIyMgcmVtb3ZlIGl0IGJ5IGNhbGN1bGF0aW5nIHRoZSBwcm9wZXIgc2l6ZSwgYW5kIHRoZW4KICAgICAgICAgICAgICAgICMjIyB0b3NzaW5nIG91dCBldmVyeXRoaW5nIHRoYXQncyBsb25nZXIgdGhhbiB0aGF0IHNpemUuCgogICAgICAgICAgICAgICAgIyMjIGNvdW50IG51bWJlciBvZiBudWxscwogICAgICAgICAgICAgICAgbXkgJG51bGxzID0gJCRkYXRhID1+IHRyL1wwL1wwLzsKCiAgICAgICAgICAgICAgICAjIyMgY3V0IGRhdGEgKyBzaXplIGJ5IHRoYXQgbWFueSBieXRlcwogICAgICAgICAgICAgICAgJGVudHJ5LT5zaXplKCAkZW50cnktPnNpemUgLSAkbnVsbHMgKTsKICAgICAgICAgICAgICAgIHN1YnN0ciAoJCRkYXRhLCAkZW50cnktPnNpemUpID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMjIyBjbGVhbiB1cCBvZiB0aGUgZW50cmllcy4uIHBvc2l4IHRhciAvYXBwYXJlbnRseS8gaGFzIHNvbWUKICAgICAgICAjIyMgd2VpcmQgJ2ZlYXR1cmUnIHRoYXQgYWxsb3dzIGZvciBmaWxlbmFtZXMgPiAyNTUgY2hhcmFjdGVycwogICAgICAgICMjIyB0aGV5J2xsIHB1dCBhIGhlYWRlciBpbiB3aXRoIGFzIG5hbWUgJy4vLi9ATG9uZ0xpbmsnIGFuZCB0aGUKICAgICAgICAjIyMgY29udGVudHMgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgL25leHQvIGZpbGUgaW4gdGhlIGFyY2hpdmUKICAgICAgICAjIyMgcHJldHR5IGNyYXBweSBhbmQga2x1ZGd5IGlmIHlvdSBhc2sgbWUKCiAgICAgICAgIyMjIHNldCB0aGUgbmFtZSBmb3IgdGhlIG5leHQgZW50cnkgaWYgdGhpcyBpcyBhIEBMb25nTGluazsKICAgICAgICAjIyMgdGhpcyBpcyBvbmUgdWdseSBoYWNrID0vIGJ1dCBuZWVkZWQgZm9yIGRpcmVjdCBleHRyYWN0aW9uCiAgICAgICAgaWYoICRlbnRyeS0+aXNfbG9uZ2xpbmsgKSB7CiAgICAgICAgICAgICRyZWFsX25hbWUgPSAkZGF0YTsKICAgICAgICAgICAgbmV4dCBMT09QOwogICAgICAgIH0gZWxzaWYgKCBkZWZpbmVkICRyZWFsX25hbWUgKSB7CiAgICAgICAgICAgICRlbnRyeS0+bmFtZSggJCRyZWFsX25hbWUgKTsKICAgICAgICAgICAgJGVudHJ5LT5wcmVmaXgoJycpOwogICAgICAgICAgICB1bmRlZiAkcmVhbF9uYW1lOwogICAgICAgIH0KCiAgICAgICAgJHNlbGYtPl9leHRyYWN0X2ZpbGUoICRlbnRyeSApIGlmICRleHRyYWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRlbnRyeS0+aXNfbG9uZ2xpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhJGVudHJ5LT5pc191bmtub3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRlbnRyeS0+aXNfbGFiZWw7CgogICAgICAgICMjIyBHdWFyZCBhZ2FpbnN0IHRhcmZpbGVzIHdpdGggZ2FyYmFnZSBhdCB0aGUgZW5kCgkgICAgbGFzdCBMT09QIGlmICRlbnRyeS0+bmFtZSBlcSAnJzsKCiAgICAgICAgIyMjIHB1c2ggb25seSB0aGUgbmFtZSBvbiB0aGUgcnYgaWYgd2UncmUgZXh0cmFjdGluZwogICAgICAgICMjIyAtLSBmb3IgZXh0cmFjdF9hcmNoaXZlCiAgICAgICAgcHVzaCBAJHRhcmZpbGUsICgkZXh0cmFjdCA/ICRlbnRyeS0+bmFtZSA6ICRlbnRyeSk7CgogICAgICAgIGlmKCAkbGltaXQgKSB7CiAgICAgICAgICAgICRjb3VudC0tIHVubGVzcyAkZW50cnktPmlzX2xvbmdsaW5rIHx8ICRlbnRyeS0+aXNfZGlyOwogICAgICAgICAgICBsYXN0IExPT1AgdW5sZXNzICRjb3VudDsKICAgICAgICB9CiAgICB9IGNvbnRpbnVlIHsKICAgICAgICB1bmRlZiAkZGF0YTsKICAgIH0KCiAgICByZXR1cm4gJHRhcmZpbGU7Cn0KCj1oZWFkMiAkdGFyLT5jb250YWluc19maWxlKCAkZmlsZW5hbWUgKQoKQ2hlY2sgaWYgdGhlIGFyY2hpdmUgY29udGFpbnMgYSBjZXJ0YWluIGZpbGUuCkl0IHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgaXMgaW4gdGhlIGFyY2hpdmUsIGZhbHNlIG90aGVyd2lzZS4KCk5vdGUgaG93ZXZlciwgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgYW4gZXhhY3QgbWF0Y2ggdXNpbmcgQzxlcT4Kb24gdGhlIGZ1bGwgcGF0aC4gU28gaXQgY2Fubm90IGNvbXBlbnNhdGUgZm9yIGNhc2UtaW5zZW5zaXRpdmUgZmlsZS0Kc3lzdGVtcyBvciBjb21wYXJlIDIgcGF0aHMgdG8gc2VlIGlmIHRoZXkgd291bGQgcG9pbnQgdG8gdGhlIHNhbWUKdW5kZXJseWluZyBmaWxlLgoKPWN1dAoKc3ViIGNvbnRhaW5zX2ZpbGUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRmdWxsID0gc2hpZnQ7CiAgICAKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZnVsbDsKCiAgICAjIyMgZG9uJ3Qgd2FybiBpZiB0aGUgZW50cnkgaXNuJ3QgdGhlcmUuLiB0aGF0J3Mgd2hhdCB0aGlzIGZ1bmN0aW9uCiAgICAjIyMgaXMgZm9yIGFmdGVyIGFsbC4KICAgIGxvY2FsICRXQVJOID0gMDsKICAgIHJldHVybiAxIGlmICRzZWxmLT5fZmluZF9lbnRyeSgkZnVsbCk7CiAgICByZXR1cm47Cn0KCj1oZWFkMiAkdGFyLT5leHRyYWN0KCBbQGZpbGVuYW1lc10gKQoKV3JpdGUgZmlsZXMgd2hvc2UgbmFtZXMgYXJlIGVxdWl2YWxlbnQgdG8gYW55IG9mIHRoZSBuYW1lcyBpbgpDPEBmaWxlbmFtZXM+IHRvIGRpc2ssIGNyZWF0aW5nIHN1YmRpcmVjdG9yaWVzIGFzIG5lY2Vzc2FyeS4gVGhpcwptaWdodCBub3Qgd29yayB0b28gd2VsbCB1bmRlciBWTVMuClVuZGVyIE1hY1BlcmwsIHRoZSBmaWxlJ3MgbW9kaWZpY2F0aW9uIHRpbWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlCk1hY09TIHplcm8gb2YgdGltZSwgYW5kIGFwcHJvcHJpYXRlIGNvbnZlcnNpb25zIHdpbGwgYmUgZG9uZSB0byB0aGUKcGF0aC4gIEhvd2V2ZXIsIHRoZSBsZW5ndGggb2YgZWFjaCBlbGVtZW50IG9mIHRoZSBwYXRoIGlzIG5vdAppbnNwZWN0ZWQgdG8gc2VlIHdoZXRoZXIgaXQncyBsb25nZXIgdGhhbiBNYWNPUyBjdXJyZW50bHkgYWxsb3dzICgzMgpjaGFyYWN0ZXJzKS4KCklmIEM8ZXh0cmFjdD4gaXMgY2FsbGVkIHdpdGhvdXQgYSBsaXN0IG9mIGZpbGUgbmFtZXMsIHRoZSBlbnRpcmUKY29udGVudHMgb2YgdGhlIGFyY2hpdmUgYXJlIGV4dHJhY3RlZC4KClJldHVybnMgYSBsaXN0IG9mIGZpbGVuYW1lcyBleHRyYWN0ZWQuCgo9Y3V0CgpzdWIgZXh0cmFjdCB7CiAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgbXkgQGFyZ3MgICAgPSBAXzsKICAgIG15IEBmaWxlczsKCiAgICAjIHVzZSB0aGUgc3BlZWQgb3B0aW1pemF0aW9uIGZvciBhbGwgZXh0cmFjdGVkIGZpbGVzCiAgICBsb2NhbCgkc2VsZi0+e2N3ZH0pID0gY3dkKCkgdW5sZXNzICRzZWxmLT57Y3dkfTsKCiAgICAjIyMgeW91IHJlcXVlc3RlZCB0aGUgZXh0cmFjdGlvbiBvZiBvbmx5IGNlcnRpYW4gZmlsZXMKICAgIGlmKCBAYXJncyApIHsKICAgICAgICBmb3IgbXkgJGZpbGUgKCBAYXJncyApIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICMjIyBpdCdzIGFscmVhZHkgYW4gb2JqZWN0PwogICAgICAgICAgICBpZiggVU5JVkVSU0FMOjppc2EoICRmaWxlLCAnQXJjaGl2ZTo6VGFyOjpGaWxlJyApICkgewogICAgICAgICAgICAgICAgcHVzaCBAZmlsZXMsICRmaWxlOwogICAgICAgICAgICAgICAgbmV4dDsKCiAgICAgICAgICAgICMjIyBnbyBmaW5kIGl0IHRoZW4KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBteSAkZm91bmQ7CiAgICAgICAgICAgICAgICBmb3IgbXkgJGVudHJ5ICggQHskc2VsZi0+X2RhdGF9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgdW5sZXNzICRmaWxlIGVxICRlbnRyeS0+ZnVsbF9wYXRoOwogICAgCiAgICAgICAgICAgICAgICAgICAgIyMjIHdlIGZvdW5kIHRoZSBmaWxlIHlvdSdyZSBsb29raW5nIGZvcgogICAgICAgICAgICAgICAgICAgIHB1c2ggQGZpbGVzLCAkZW50cnk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kKys7CiAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgIHVubGVzcyggJGZvdW5kICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2VsZi0+X2Vycm9yKCAKICAgICAgICAgICAgICAgICAgICAgICAgcXFbQ291bGQgbm90IGZpbmQgJyRmaWxlJyBpbiBhcmNoaXZlXSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICMjIyBqdXN0IGdyYWIgYWxsIHRoZSBmaWxlIGl0ZW1zCiAgICB9IGVsc2UgewogICAgICAgIEBmaWxlcyA9ICRzZWxmLT5nZXRfZmlsZXM7CiAgICB9CgogICAgIyMjIG5vdGhpbmcgZm91bmQ/IHRoYXQncyBhbiBlcnJvcgogICAgdW5sZXNzKCBzY2FsYXIgQGZpbGVzICkgewogICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW05vIGZpbGVzIGZvdW5kIGZvciBdIC4gJHNlbGYtPl9maWxlICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMjIyBub3cgZXh0cmFjdCB0aGVtCiAgICBmb3IgbXkgJGVudHJ5ICggQGZpbGVzICkgewogICAgICAgIHVubGVzcyggJHNlbGYtPl9leHRyYWN0X2ZpbGUoICRlbnRyeSApICkgewogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKHFbQ291bGQgbm90IGV4dHJhY3QgJ10uICRlbnRyeS0+ZnVsbF9wYXRoIC5xWyddICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBmaWxlczsKfQoKPWhlYWQyICR0YXItPmV4dHJhY3RfZmlsZSggJGZpbGUsIFskZXh0cmFjdF9wYXRoXSApCgpXcml0ZSBhbiBlbnRyeSwgd2hvc2UgbmFtZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBmaWxlIG5hbWUgcHJvdmlkZWQgdG8KZGlzay4gT3B0aW9uYWxseSB0YWtlcyBhIHNlY29uZCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBmdWxsICh1bml4KQpwYXRoIChpbmNsdWRpbmcgZmlsZW5hbWUpIHRoZSBlbnRyeSB3aWxsIGJlIHdyaXR0ZW4gdG8uCgpGb3IgZXhhbXBsZToKCiAgICAkdGFyLT5leHRyYWN0X2ZpbGUoICduYW1lL2luL2FyY2hpdmUnLCAnbmFtZS9pL3dhbnQvdG8vZ2l2ZS9pdCcgKTsKCiAgICAkdGFyLT5leHRyYWN0X2ZpbGUoICRhdF9maWxlX29iamVjdCwgICAnbmFtZS9pL3dhbnQvdG8vZ2l2ZS9pdCcgKTsKClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIGV4dHJhY3RfZmlsZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkYWx0ICA9IHNoaWZ0OwoKICAgIG15ICRlbnRyeSA9ICRzZWxmLT5fZmluZF9lbnRyeSggJGZpbGUgKQogICAgICAgIG9yICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCBmaW5kIGFuIGVudHJ5IGZvciAnJGZpbGUnXSApLCByZXR1cm47CgogICAgcmV0dXJuICRzZWxmLT5fZXh0cmFjdF9maWxlKCAkZW50cnksICRhbHQgKTsKfQoKc3ViIF9leHRyYWN0X2ZpbGUgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICRlbnRyeSAgID0gc2hpZnQgb3IgcmV0dXJuOwogICAgbXkgJGFsdCAgICAgPSBzaGlmdDsKCiAgICAjIyMgeW91IHdhbnRlZCBhbiBhbHRlcm5hdGUgZXh0cmFjdGlvbiBsb2NhdGlvbiAjIyMKICAgIG15ICRuYW1lID0gZGVmaW5lZCAkYWx0ID8gJGFsdCA6ICRlbnRyeS0+ZnVsbF9wYXRoOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBzcGxpdHBhdGggdGFrZXMgYSBib29sIGF0IHRoZSBlbmQgdG8gaW5kaWNhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyB0aGF0IGl0J3Mgc3BsaXR0aW5nIGEgZGlyCiAgICBteSAoJHZvbCwkZGlycywkZmlsZSk7CiAgICBpZiAoIGRlZmluZWQgJGFsdCApIHsgIyBJdCdzIGEgbG9jYWwtT1MgcGF0aAogICAgICAgICgkdm9sLCRkaXJzLCRmaWxlKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggICAgICAgJGFsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbnRyeS0+aXNfZGlyICk7CiAgICB9IGVsc2UgewogICAgICAgICgkdm9sLCRkaXJzLCRmaWxlKSA9IEZpbGU6OlNwZWM6OlVuaXgtPnNwbGl0cGF0aCggJG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW50cnktPmlzX2RpciApOwogICAgfQoKICAgIG15ICRkaXI7CiAgICAjIyMgaXMgJG5hbWUgYW4gYWJzb2x1dGUgcGF0aD8gIyMjCiAgICBpZiggRmlsZTo6U3BlYy0+ZmlsZV9uYW1lX2lzX2Fic29sdXRlKCAkZGlycyApICkgewogICAgICAgICRkaXIgPSAkZGlyczsKCiAgICAjIyMgaXQncyBhIHJlbGF0aXZlIHBhdGggIyMjCiAgICB9IGVsc2UgewogICAgICAgIG15ICRjd2QgICAgID0gKGRlZmluZWQgJHNlbGYtPntjd2R9ID8gJHNlbGYtPntjd2R9IDogY3dkKCkpOwogICAgICAgIG15IEBkaXJzICAgID0gRmlsZTo6U3BlYzo6VW5peC0+c3BsaXRkaXIoICRkaXJzICk7CiAgICAgICAgbXkgQGN3ZCAgICAgPSBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGN3ZCApOwogICAgICAgICRkaXIgICAgICAgID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAY3dkLCBAZGlycyApOwoKICAgICAgICAjIGNhdGRpcigpIHJldHVybnMgdW5kZWYgaWYgdGhlIHBhdGggaXMgbG9uZ2VyIHRoYW4gMjU1IGNoYXJzIG9uIFZNUwogICAgICAgIHVubGVzcyAoIGRlZmluZWQgJGRpciApIHsKICAgICAgICAgICAgJF5XICYmICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCBjb21wb3NlIGEgcGF0aCBmb3IgJyRkaXJzJ1xuXSApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgIH0KCiAgICBpZiggLWUgJGRpciAmJiAhLWQgXyApIHsKICAgICAgICAkXlcgJiYgJHNlbGYtPl9lcnJvciggcXFbJyRkaXInIGV4aXN0cywgYnV0IGl0J3Mgbm90IGEgZGlyZWN0b3J5IVxuXSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB1bmxlc3MgKCAtZCBfICkgewogICAgICAgIGV2YWwgeyBGaWxlOjpQYXRoOjpta3BhdGgoICRkaXIsIDAsIDA3NzcgKSB9OwogICAgICAgIGlmKCAkQCApIHsKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgJyRkaXInOiAkQF0gKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAjIyMgWFhYIGNob3duIGhlcmU/IHRoYXQgbWlnaHQgbm90IGJlIHRoZSBzYW1lIGFzIGluIHRoZSBhcmNoaXZlCiAgICAgICAgIyMjIGFzIHdlJ3JlIG9ubHkgY2hvd24naW5nIHRvIHRoZSBvd25lciBvZiB0aGUgZmlsZSB3ZSdyZSBleHRyYWN0aW5nCiAgICAgICAgIyMjIG5vdCB0byB0aGUgb3duZXIgb2YgdGhlIGRpcmVjdG9yeSBpdHNlbGYsIHdoaWNoIG1heSBvciBtYXkgbm90CiAgICAgICAgIyMjIGJlIGFub3RoZXIgZW50cnkgaW4gdGhlIGFyY2hpdmUKICAgICAgICAjIyMgQW5zd2VyOiBubywgZ251IHRhciBkb2Vzbid0IGRvIGl0IGVpdGhlciwgaXQnZCBiZSB0aGUgd3JvbmcKICAgICAgICAjIyMgd2F5IHRvIGdvLgogICAgICAgICNpZiggJENIT1dOICYmIENBTl9DSE9XTiApIHsKICAgICAgICAjICAgIGNob3duICRlbnRyeS0+dWlkLCAkZW50cnktPmdpZCwgJGRpciBvcgogICAgICAgICMgICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCBzZXQgdWlkL2dpZCBvbiAnJGRpciddICk7CiAgICAgICAgI30KICAgIH0KCiAgICAjIyMgd2UncmUgZG9uZSBpZiB3ZSBqdXN0IG5lZWRlZCB0byBjcmVhdGUgYSBkaXIgIyMjCiAgICByZXR1cm4gMSBpZiAkZW50cnktPmlzX2RpcjsKCiAgICBteSAkZnVsbCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoICRkaXIsICRmaWxlICk7CgogICAgaWYoICRlbnRyeS0+aXNfdW5rbm93biApIHsKICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtVbmtub3duIGZpbGUgdHlwZSBmb3IgZmlsZSAnJGZ1bGwnXSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiggbGVuZ3RoICRlbnRyeS0+dHlwZSAmJiAkZW50cnktPmlzX2ZpbGUgKSB7CiAgICAgICAgbXkgJGZoID0gSU86OkZpbGUtPm5ldzsKICAgICAgICAkZmgtPm9wZW4oICc+JyAuICRmdWxsICkgb3IgKAogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtDb3VsZCBub3Qgb3BlbiBmaWxlICckZnVsbCc6ICQhXSApLAogICAgICAgICAgICByZXR1cm4KICAgICAgICApOwoKICAgICAgICBpZiggJGVudHJ5LT5zaXplICkgewogICAgICAgICAgICBiaW5tb2RlICRmaDsKICAgICAgICAgICAgc3lzd3JpdGUgJGZoLCAkZW50cnktPmRhdGEgb3IgKAogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IHdyaXRlIGRhdGEgdG8gJyRmdWxsJ10gKSwKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgY2xvc2UgJGZoIG9yICgKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IGNsb3NlIGZpbGUgJyRmdWxsJ10gKSwKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgKTsKCiAgICB9IGVsc2UgewogICAgICAgICRzZWxmLT5fbWFrZV9zcGVjaWFsX2ZpbGUoICRlbnRyeSwgJGZ1bGwgKSBvciByZXR1cm47CiAgICB9CgogICAgdXRpbWUgdGltZSwgJGVudHJ5LT5tdGltZSAtIFRJTUVfT0ZGU0VULCAkZnVsbCBvcgogICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCB1cGRhdGUgdGltZXN0YW1wXSApOwoKICAgIGlmKCAkQ0hPV04gJiYgQ0FOX0NIT1dOICkgewogICAgICAgIGNob3duICRlbnRyeS0+dWlkLCAkZW50cnktPmdpZCwgJGZ1bGwgb3IKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IHNldCB1aWQvZ2lkIG9uICckZnVsbCddICk7CiAgICB9CgogICAgIyMjIG9ubHkgY2htb2QgaWYgd2UncmUgYWxsb3dlZCB0bywgYnV0IG5ldmVyIGNobW9kIHN5bWxpbmtzLCBzaW5jZSB0aGV5J2xsCiAgICAjIyMgY2hhbmdlIHRoZSBwZXJtcyBvbiB0aGUgZmlsZSB0aGV5J3JlIGxpbmtpbmcgdG9vLi4uCiAgICBpZiggJENITU9EIGFuZCBub3QgLWwgJGZ1bGwgKSB7CiAgICAgICAgY2htb2QgJGVudHJ5LT5tb2RlLCAkZnVsbCBvcgogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtDb3VsZCBub3QgY2hvd24gJyRmdWxsJyB0byBdIC4gJGVudHJ5LT5tb2RlICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfbWFrZV9zcGVjaWFsX2ZpbGUgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICRlbnRyeSAgID0gc2hpZnQgICAgIG9yIHJldHVybjsKICAgIG15ICRmaWxlICAgID0gc2hpZnQ7ICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZmlsZTsKCiAgICBteSAkZXJyOwoKICAgIGlmKCAkZW50cnktPmlzX3N5bWxpbmsgKSB7CiAgICAgICAgbXkgJGZhaWw7CiAgICAgICAgaWYoIE9OX1VOSVggKSB7CiAgICAgICAgICAgIHN5bWxpbmsoICRlbnRyeS0+bGlua25hbWUsICRmaWxlICkgb3IgJGZhaWwrKzsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPl9leHRyYWN0X3NwZWNpYWxfZmlsZV9hc19wbGFpbl9maWxlKCAkZW50cnksICRmaWxlICkKICAgICAgICAgICAgICAgIG9yICRmYWlsKys7CiAgICAgICAgfQoKICAgICAgICAkZXJyID0gIHFxW01ha2luZyBzeW1ib2xpbmsgbGluayBmcm9tICddIC4gJGVudHJ5LT5saW5rbmFtZSAuCiAgICAgICAgICAgICAgICBxcVsnIHRvICckZmlsZScgZmFpbGVkXSBpZiAkZmFpbDsKCiAgICB9IGVsc2lmICggJGVudHJ5LT5pc19oYXJkbGluayApIHsKICAgICAgICBteSAkZmFpbDsKICAgICAgICBpZiggT05fVU5JWCApIHsKICAgICAgICAgICAgbGluayggJGVudHJ5LT5saW5rbmFtZSwgJGZpbGUgKSBvciAkZmFpbCsrOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc2VsZi0+X2V4dHJhY3Rfc3BlY2lhbF9maWxlX2FzX3BsYWluX2ZpbGUoICRlbnRyeSwgJGZpbGUgKQogICAgICAgICAgICAgICAgb3IgJGZhaWwrKzsKICAgICAgICB9CgogICAgICAgICRlcnIgPSAgcXFbTWFraW5nIGhhcmQgbGluayBmcm9tICddIC4gJGVudHJ5LT5saW5rbmFtZSAuCiAgICAgICAgICAgICAgICBxcVsnIHRvICckZmlsZScgZmFpbGVkXSBpZiAkZmFpbDsKCiAgICB9IGVsc2lmICggJGVudHJ5LT5pc19maWZvICkgewogICAgICAgIE9OX1VOSVggJiYgIXN5c3RlbSgnbWtub2QnLCAkZmlsZSwgJ3AnKSBvcgogICAgICAgICAgICAkZXJyID0gcXFbTWFraW5nIGZpZm8gJ10uICRlbnRyeS0+bmFtZSAucXFbJyBmYWlsZWRdOwoKICAgIH0gZWxzaWYgKCAkZW50cnktPmlzX2Jsb2NrZGV2IG9yICRlbnRyeS0+aXNfY2hhcmRldiApIHsKICAgICAgICBteSAkbW9kZSA9ICRlbnRyeS0+aXNfYmxvY2tkZXYgPyAnYicgOiAnYyc7CgogICAgICAgIE9OX1VOSVggJiYgIXN5c3RlbSgnbWtub2QnLCAkZmlsZSwgJG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW50cnktPmRldm1ham9yLCAkZW50cnktPmRldm1pbm9yKSBvcgogICAgICAgICAgICAkZXJyID0gIHFxW01ha2luZyBibG9jayBkZXZpY2UgJ10uICRlbnRyeS0+bmFtZSAucXFbJyAobWFqPV0gLgogICAgICAgICAgICAgICAgICAgICRlbnRyeS0+ZGV2bWFqb3IgLiBxcVsgbWluPV0gLiAkZW50cnktPmRldm1pbm9yIC4KICAgICAgICAgICAgICAgICAgICBxcVspIGZhaWxlZC5dOwoKICAgIH0gZWxzaWYgKCAkZW50cnktPmlzX3NvY2tldCApIHsKICAgICAgICAjIyMgdGhlIG9yaWdpbmFsIGRvZXNuJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3Igc29ja2V0cy4uLi4gIyMjCiAgICAgICAgMTsKICAgIH0KCiAgICByZXR1cm4gJGVyciA/ICRzZWxmLT5fZXJyb3IoICRlcnIgKSA6IDE7Cn0KCiMjIyBkb24ndCBrbm93IGhvdyB0byBtYWtlIHN5bWxpbmtzLCBsZXQncyBqdXN0IGV4dHJhY3QgdGhlIGZpbGUgYXMKIyMjIGEgcGxhaW4gZmlsZQpzdWIgX2V4dHJhY3Rfc3BlY2lhbF9maWxlX2FzX3BsYWluX2ZpbGUgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICRlbnRyeSAgID0gc2hpZnQgICAgIG9yIHJldHVybjsKICAgIG15ICRmaWxlICAgID0gc2hpZnQ7ICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZmlsZTsKCiAgICBteSAkZXJyOwogICAgVFJZOiB7CiAgICAgICAgbXkgJG9yaWcgPSAkc2VsZi0+X2ZpbmRfZW50cnkoICRlbnRyeS0+bGlua25hbWUgKTsKCiAgICAgICAgdW5sZXNzKCAkb3JpZyApIHsKICAgICAgICAgICAgJGVyciA9ICBxcVtDb3VsZCBub3QgZmluZCBmaWxlICddIC4gJGVudHJ5LT5saW5rbmFtZSAuCiAgICAgICAgICAgICAgICAgICAgcXFbJyBpbiBtZW1vcnkuXTsKICAgICAgICAgICAgbGFzdCBUUlk7CiAgICAgICAgfQoKICAgICAgICAjIyMgY2xvbmUgdGhlIGVudHJ5LCBtYWtlIGl0IGFwcGVhciBhcyBhIG5vcm1hbCBmaWxlICMjIwogICAgICAgIG15ICRjbG9uZSA9ICRlbnRyeS0+Y2xvbmU7CiAgICAgICAgJGNsb25lLT5fZG93bmdyYWRlX3RvX3BsYWluZmlsZTsKICAgICAgICAkc2VsZi0+X2V4dHJhY3RfZmlsZSggJGNsb25lLCAkZmlsZSApIG9yIGxhc3QgVFJZOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigkZXJyKTsKfQoKPWhlYWQyICR0YXItPmxpc3RfZmlsZXMoIFtcQHByb3BlcnRpZXNdICkKClJldHVybnMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlLgoKSWYgQzxsaXN0X2ZpbGVzKCk+IGlzIHBhc3NlZCBhbiBhcnJheSByZWZlcmVuY2UgYXMgaXRzIGZpcnN0IGFyZ3VtZW50Cml0IHJldHVybnMgYSBsaXN0IG9mIGhhc2ggcmVmZXJlbmNlcyBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQKcHJvcGVydGllcyBvZiBlYWNoIGZpbGUuICBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgcHJvcGVydGllcyBpcwpzdXBwb3J0ZWQ6IG5hbWUsIHNpemUsIG10aW1lIChsYXN0IG1vZGlmaWVkIGRhdGUpLCBtb2RlLCB1aWQsIGdpZCwKbGlua25hbWUsIHVuYW1lLCBnbmFtZSwgZGV2bWFqb3IsIGRldm1pbm9yLCBwcmVmaXguCgpQYXNzaW5nIGFuIGFycmF5IHJlZmVyZW5jZSBjb250YWluaW5nIG9ubHkgb25lIGVsZW1lbnQsICduYW1lJywgaXMKc3BlY2lhbCBjYXNlZCB0byByZXR1cm4gYSBsaXN0IG9mIG5hbWVzIHJhdGhlciB0aGFuIGEgbGlzdCBvZiBoYXNoCnJlZmVyZW5jZXMsIG1ha2luZyBpdCBlcXVpdmFsZW50IHRvIGNhbGxpbmcgQzxsaXN0X2ZpbGVzPiB3aXRob3V0CmFyZ3VtZW50cy4KCj1jdXQKCnN1YiBsaXN0X2ZpbGVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkYXJlZiA9IHNoaWZ0IHx8IFsgXTsKCiAgICB1bmxlc3MoICRzZWxmLT5fZGF0YSApIHsKICAgICAgICAkc2VsZi0+cmVhZCgpIG9yIHJldHVybjsKICAgIH0KCiAgICBpZiggQCRhcmVmID09IDAgb3IgKCBAJGFyZWYgPT0gMSBhbmQgJGFyZWYtPlswXSBlcSAnbmFtZScgKSApIHsKICAgICAgICByZXR1cm4gbWFwIHsgJF8tPmZ1bGxfcGF0aCB9IEB7JHNlbGYtPl9kYXRhfTsKICAgIH0gZWxzZSB7CgogICAgICAgICNteSBAcnY7CiAgICAgICAgI2ZvciBteSAkb2JqICggQHskc2VsZi0+X2RhdGF9ICkgewogICAgICAgICMgICAgcHVzaCBAcnYsIHsgbWFwIHsgJF8gPT4gJG9iai0+JF8oKSB9IEAkYXJlZiB9OwogICAgICAgICN9CiAgICAgICAgI3JldHVybiBAcnY7CgogICAgICAgICMjIyB0aGlzIGRvZXMgdGhlIHNhbWUgYXMgdGhlIGFib3ZlLi4ganVzdCBuZWVkcyBhICt7IH0KICAgICAgICAjIyMgdG8gbWFrZSBzdXJlIHBlcmwgZG9lc24ndCBjb25mdXNlIGl0IGZvciBhIGJsb2NrCiAgICAgICAgcmV0dXJuIG1hcCB7ICAgIG15ICRvPSRfOwogICAgICAgICAgICAgICAgICAgICAgICAreyBtYXAgeyAkXyA9PiAkby0+JF8oKSB9IEAkYXJlZiB9CiAgICAgICAgICAgICAgICAgICAgfSBAeyRzZWxmLT5fZGF0YX07CiAgICB9Cn0KCnN1YiBfZmluZF9lbnRyeSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsKCiAgICB1bmxlc3MoIGRlZmluZWQgJGZpbGUgKSB7CiAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbTm8gZmlsZSBzcGVjaWZpZWRdICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMjIyBpdCdzIGFuIG9iamVjdCBhbHJlYWR5CiAgICByZXR1cm4gJGZpbGUgaWYgVU5JVkVSU0FMOjppc2EoICRmaWxlLCAnQXJjaGl2ZTo6VGFyOjpGaWxlJyApOwoKICAgIGZvciBteSAkZW50cnkgKCBAeyRzZWxmLT5fZGF0YX0gKSB7CiAgICAgICAgbXkgJHBhdGggPSAkZW50cnktPmZ1bGxfcGF0aDsKICAgICAgICByZXR1cm4gJGVudHJ5IGlmICRwYXRoIGVxICRmaWxlOwogICAgfQoKICAgICRzZWxmLT5fZXJyb3IoIHFxW05vIHN1Y2ggZmlsZSBpbiBhcmNoaXZlOiAnJGZpbGUnXSApOwogICAgcmV0dXJuOwp9Cgo9aGVhZDIgJHRhci0+Z2V0X2ZpbGVzKCBbQGZpbGVuYW1lc10gKQoKUmV0dXJucyB0aGUgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IG9iamVjdHMgbWF0Y2hpbmcgdGhlIGZpbGVuYW1lcwpwcm92aWRlZC4gSWYgbm8gZmlsZW5hbWUgbGlzdCB3YXMgcGFzc2VkLCBhbGwgQzxBcmNoaXZlOjpUYXI6OkZpbGU+Cm9iamVjdHMgaW4gdGhlIGN1cnJlbnQgVGFyIG9iamVjdCBhcmUgcmV0dXJuZWQuCgpQbGVhc2UgcmVmZXIgdG8gdGhlIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBkb2N1bWVudGF0aW9uIG9uIGhvdyB0bwpoYW5kbGUgdGhlc2Ugb2JqZWN0cy4KCj1jdXQKCnN1YiBnZXRfZmlsZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gQHsgJHNlbGYtPl9kYXRhIH0gdW5sZXNzIEBfOwoKICAgIG15IEBsaXN0OwogICAgZm9yIG15ICRmaWxlICggQF8gKSB7CiAgICAgICAgcHVzaCBAbGlzdCwgZ3JlcCB7IGRlZmluZWQgfSAkc2VsZi0+X2ZpbmRfZW50cnkoICRmaWxlICk7CiAgICB9CgogICAgcmV0dXJuIEBsaXN0Owp9Cgo9aGVhZDIgJHRhci0+Z2V0X2NvbnRlbnQoICRmaWxlICkKClJldHVybiB0aGUgY29udGVudCBvZiB0aGUgbmFtZWQgZmlsZS4KCj1jdXQKCnN1YiBnZXRfY29udGVudCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGVudHJ5ID0gJHNlbGYtPl9maW5kX2VudHJ5KCBzaGlmdCApIG9yIHJldHVybjsKCiAgICByZXR1cm4gJGVudHJ5LT5kYXRhOwp9Cgo9aGVhZDIgJHRhci0+cmVwbGFjZV9jb250ZW50KCAkZmlsZSwgJGNvbnRlbnQgKQoKTWFrZSB0aGUgc3RyaW5nICRjb250ZW50IGJlIHRoZSBjb250ZW50IGZvciB0aGUgZmlsZSBuYW1lZCAkZmlsZS4KCj1jdXQKCnN1YiByZXBsYWNlX2NvbnRlbnQgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRlbnRyeSA9ICRzZWxmLT5fZmluZF9lbnRyeSggc2hpZnQgKSBvciByZXR1cm47CgogICAgcmV0dXJuICRlbnRyeS0+cmVwbGFjZV9jb250ZW50KCBzaGlmdCApOwp9Cgo9aGVhZDIgJHRhci0+cmVuYW1lKCAkZmlsZSwgJG5ld19uYW1lICkKClJlbmFtZSB0aGUgZmlsZSBvZiB0aGUgaW4tbWVtb3J5IGFyY2hpdmUgdG8gJG5ld19uYW1lLgoKTm90ZSB0aGF0IHlvdSBtdXN0IHNwZWNpZnkgYSBVbml4IHBhdGggZm9yICRuZXdfbmFtZSwgc2luY2UgcGVyIHRhcgpzdGFuZGFyZCwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlIG11c3QgYmUgVW5peCBwYXRocy4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIHJlbmFtZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRmaWxlOwogICAgbXkgJG5ldyAgPSBzaGlmdDsgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRuZXc7CgogICAgbXkgJGVudHJ5ID0gJHNlbGYtPl9maW5kX2VudHJ5KCAkZmlsZSApIG9yIHJldHVybjsKCiAgICByZXR1cm4gJGVudHJ5LT5yZW5hbWUoICRuZXcgKTsKfQoKPWhlYWQyICR0YXItPnJlbW92ZSAoQGZpbGVuYW1lbGlzdCkKClJlbW92ZXMgYW55IGVudHJpZXMgd2l0aCBuYW1lcyBtYXRjaGluZyBhbnkgb2YgdGhlIGdpdmVuIGZpbGVuYW1lcwpmcm9tIHRoZSBpbi1tZW1vcnkgYXJjaGl2ZS4gUmV0dXJucyBhIGxpc3Qgb2YgQzxBcmNoaXZlOjpUYXI6OkZpbGU+Cm9iamVjdHMgdGhhdCByZW1haW4uCgo9Y3V0CgpzdWIgcmVtb3ZlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAbGlzdCA9IEBfOwoKICAgIG15ICVzZWVuID0gbWFwIHsgJF8tPmZ1bGxfcGF0aCA9PiAkXyB9IEB7JHNlbGYtPl9kYXRhfTsKICAgIGRlbGV0ZSAkc2VlbnsgJF8gfSBmb3IgQGxpc3Q7CgogICAgJHNlbGYtPl9kYXRhKCBbdmFsdWVzICVzZWVuXSApOwoKICAgIHJldHVybiB2YWx1ZXMgJXNlZW47Cn0KCj1oZWFkMiAkdGFyLT5jbGVhcgoKQzxjbGVhcj4gY2xlYXJzIHRoZSBjdXJyZW50IGluLW1lbW9yeSBhcmNoaXZlLiBUaGlzIGVmZmVjdGl2ZWx5IGdpdmVzCnlvdSBhICdibGFuaycgb2JqZWN0LCByZWFkeSB0byBiZSBmaWxsZWQgYWdhaW4uIE5vdGUgdGhhdCBDPGNsZWFyPgpvbmx5IGhhcyBlZmZlY3Qgb24gdGhlIG9iamVjdCwgbm90IHRoZSB1bmRlcmx5aW5nIHRhcmZpbGUuCgo9Y3V0CgpzdWIgY2xlYXIgewogICAgbXkgJHNlbGYgPSBzaGlmdCBvciByZXR1cm47CgogICAgJHNlbGYtPl9kYXRhKCBbXSApOwogICAgJHNlbGYtPl9maWxlKCAnJyApOwoKICAgIHJldHVybiAxOwp9CgoKPWhlYWQyICR0YXItPndyaXRlICggWyRmaWxlLCAkY29tcHJlc3NlZCwgJHByZWZpeF0gKQoKV3JpdGUgdGhlIGluLW1lbW9yeSBhcmNoaXZlIHRvIGRpc2suICBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGVpdGhlcgpiZSB0aGUgbmFtZSBvZiBhIGZpbGUgb3IgYSByZWZlcmVuY2UgdG8gYW4gYWxyZWFkeSBvcGVuIGZpbGVoYW5kbGUgKGEKR0xPQiByZWZlcmVuY2UpLiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRydWUsIHRoZSBtb2R1bGUgd2lsbCB1c2UKSU86OlpsaWIgdG8gd3JpdGUgdGhlIGZpbGUgaW4gYSBjb21wcmVzc2VkIGZvcm1hdC4gIElmIElPOjpabGliIGlzCm5vdCBhdmFpbGFibGUsIHRoZSBDPHdyaXRlPiBtZXRob2Qgd2lsbCBmYWlsIGFuZCByZXR1cm4uCgpOb3RlIHRoYXQgd2hlbiB5b3UgcGFzcyBpbiBhIGZpbGVoYW5kbGUsIHRoZSBjb21wcmVzc2lvbiBhcmd1bWVudAppcyBpZ25vcmVkLCBhcyBhbGwgZmlsZXMgYXJlIHByaW50ZWQgdmVyYmF0aW0gdG8geW91ciBmaWxlaGFuZGxlLgpJZiB5b3Ugd2lzaCB0byBlbmFibGUgY29tcHJlc3Npb24gd2l0aCBmaWxlaGFuZGxlcywgdXNlIGFuCkM8SU86OlpsaWI+IGZpbGVoYW5kbGUgaW5zdGVhZC4KClNwZWNpZmljIGxldmVscyBvZiBjb21wcmVzc2lvbiBjYW4gYmUgY2hvc2VuIGJ5IHBhc3NpbmcgdGhlIHZhbHVlcyAyCnRocm91Z2ggOSBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KClRoZSB0aGlyZCBhcmd1bWVudCBpcyBhbiBvcHRpb25hbCBwcmVmaXguIEFsbCBmaWxlcyB3aWxsIGJlIHR1Y2tlZAphd2F5IGluIHRoZSBkaXJlY3RvcnkgeW91IHNwZWNpZnkgYXMgcHJlZml4LiBTbyBpZiB5b3UgaGF2ZSBmaWxlcwonYScgYW5kICdiJyBpbiB5b3VyIGFyY2hpdmUsIGFuZCB5b3Ugc3BlY2lmeSAnZm9vJyBhcyBwcmVmaXgsIHRoZXkKd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBhcmNoaXZlIGFzICdmb28vYScgYW5kICdmb28vYicuCgpJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBDPHdyaXRlPiByZXR1cm5zIHRoZSBlbnRpcmUgZm9ybWF0dGVkCmFyY2hpdmUgYXMgYSBzdHJpbmcsIHdoaWNoIGNvdWxkIGJlIHVzZWZ1bCBpZiB5b3UnZCBsaWtlIHRvIHN0dWZmIHRoZQphcmNoaXZlIGludG8gYSBzb2NrZXQgb3IgYSBwaXBlIHRvIGd6aXAgb3Igc29tZXRoaW5nLgoKPWN1dAoKc3ViIHdyaXRlIHsKICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OwogICAgbXkgJGZpbGUgICAgICAgID0gc2hpZnQ7ICRmaWxlID0gJycgdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkZ3ppcCAgICAgICAgPSBzaGlmdCB8fCAwOwogICAgbXkgJGV4dF9wcmVmaXggID0gc2hpZnQ7ICRleHRfcHJlZml4ID0gJycgdW5sZXNzIGRlZmluZWQgJGV4dF9wcmVmaXg7CiAgICBteSAkZHVtbXkgICAgICAgPSAnJzsKICAgIAogICAgIyMjIG9ubHkgbmVlZCBhIGhhbmRsZSBpZiB3ZSBoYXZlIGEgZmlsZSB0byBwcmludCB0byAjIyMKICAgIG15ICRoYW5kbGUgPSBsZW5ndGgoJGZpbGUpCiAgICAgICAgICAgICAgICAgICAgPyAoICRzZWxmLT5fZ2V0X2hhbmRsZSgkZmlsZSwgJGd6aXAsIFdSSVRFX09OTFktPigkZ3ppcCkgKQogICAgICAgICAgICAgICAgICAgICAgICBvciByZXR1cm4gKQogICAgICAgICAgICAgICAgICAgIDogJEhBU19QRVJMSU8gICAgPyBkbyB7IG9wZW4gbXkgJGgsICc+JywgXCRkdW1teTsgJGggfQogICAgICAgICAgICAgICAgICAgIDogJEhBU19JT19TVFJJTkcgPyBJTzo6U3RyaW5nLT5uZXcgCiAgICAgICAgICAgICAgICAgICAgOiBfX1BBQ0tBR0VfXy0+bm9fc3RyaW5nX3N1cHBvcnQoKTsKCgoKICAgIGZvciBteSAkZW50cnkgKCBAeyRzZWxmLT5fZGF0YX0gKSB7CiAgICAgICAgIyMjIGVudHJpZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgdGFyZmlsZSAjIyMKICAgICAgICBteSBAd3JpdGVfbWU7CgogICAgICAgICMjIyBvbmx5IG5vdyB3aWxsIHdlIGNoYW5nZSB0aGUgb2JqZWN0IHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGUKICAgICAgICAjIyMgb2YgdGhlIG5hbWUgYW5kIHByZWZpeCBmaWVsZHMgLS0gdGhpcyBuZWVkcyB0byBiZSBsaW1pdGVkIHRvCiAgICAgICAgIyMjIHdyaXRlKCkgb25seSEKICAgICAgICBteSAkY2xvbmUgPSAkZW50cnktPmNsb25lOwoKCiAgICAgICAgIyMjIHNvLCBpZiB5b3UgZG9uJ3Qgd2FudCB1c2UgdG8gdXNlIHRoZSBwcmVmaXgsIHdlJ2xsIHN0dWZmIAogICAgICAgICMjIyBldmVyeXRoaW5nIGluIHRoZSBuYW1lIGZpZWxkIGluc3RlYWQKICAgICAgICBpZiggJERPX05PVF9VU0VfUFJFRklYICkgewoKICAgICAgICAgICAgIyMjIHlvdSBtaWdodCBoYXZlIGFuIGV4dGVuZGVkIHByZWZpeCwgaWYgc28sIHNldCBpdCBpbiB0aGUgY2xvbmUKICAgICAgICAgICAgIyMjIFhYWCBpcyA6OlVuaXggcmlnaHQ/CiAgICAgICAgICAgICRjbG9uZS0+bmFtZSggbGVuZ3RoICRleHRfcHJlZml4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZpbGU6OlNwZWM6OlVuaXgtPmNhdGRpciggJGV4dF9wcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsb25lLT5mdWxsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICRjbG9uZS0+ZnVsbF9wYXRoICk7CiAgICAgICAgICAgICRjbG9uZS0+cHJlZml4KCAnJyApOwoKICAgICAgICAjIyMgb3RoZXJ3aXNlLCB3ZSdsbCBoYXZlIHRvIHNldCBpdCBwcm9wZXJseSAtLSBwcmVmaXggcGFydCBpbiB0aGUKICAgICAgICAjIyMgcHJlZml4IGFuZCBuYW1lIHBhcnQgaW4gdGhlIG5hbWUgZmllbGQuCiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICMjIyBzcGxpdCB0aGVtIGhlcmUsIG5vdCBiZWZvcmUhCiAgICAgICAgICAgIG15ICgkcHJlZml4LCRuYW1lKSA9ICRjbG9uZS0+X3ByZWZpeF9hbmRfZmlsZSggJGNsb25lLT5mdWxsX3BhdGggKTsKCiAgICAgICAgICAgICMjIyB5b3UgbWlnaHQgaGF2ZSBhbiBleHRlbmRlZCBwcmVmaXgsIGlmIHNvLCBzZXQgaXQgaW4gdGhlIGNsb25lCiAgICAgICAgICAgICMjIyBYWFggaXMgOjpVbml4IHJpZ2h0PwogICAgICAgICAgICAkcHJlZml4ID0gRmlsZTo6U3BlYzo6VW5peC0+Y2F0ZGlyKCAkZXh0X3ByZWZpeCwgJHByZWZpeCApCiAgICAgICAgICAgICAgICBpZiBsZW5ndGggJGV4dF9wcmVmaXg7CgogICAgICAgICAgICAkY2xvbmUtPnByZWZpeCggJHByZWZpeCApOwogICAgICAgICAgICAkY2xvbmUtPm5hbWUoICRuYW1lICk7CiAgICAgICAgfQoKICAgICAgICAjIyMgbmFtZXMgYXJlIHRvbyBsb25nLCBhbmQgd2lsbCBnZXQgdHJ1bmNhdGVkIGlmIHdlIGRvbid0IGFkZCBhCiAgICAgICAgIyMjICdATG9uZ0xpbmsnIGZpbGUuLi4KICAgICAgICBteSAkbWFrZV9sb25nbGluayA9ICggICBsZW5ndGgoJGNsb25lLT5uYW1lKSAgICA+IE5BTUVfTEVOR1RIIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKCRjbG9uZS0+cHJlZml4KSAgPiBQUkVGSVhfTEVOR1RICiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8IDA7CgogICAgICAgICMjIyBwZXJoYXBzIHdlIG5lZWQgdG8gbWFrZSBhIGxvbmdsaW5rIGZpbGU/CiAgICAgICAgaWYoICRtYWtlX2xvbmdsaW5rICkgewogICAgICAgICAgICBteSAkbG9uZ2xpbmsgPSBBcmNoaXZlOjpUYXI6OkZpbGUtPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPT4gTE9OR0xJTktfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbG9uZS0+ZnVsbF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlID0+IExPTkdMSU5LIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHVubGVzcyggJGxvbmdsaW5rICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggIHFxW0NvdWxkIG5vdCBjcmVhdGUgJ0xvbmdMaW5rJyBlbnRyeSBmb3IgXSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFbb3ZlcnNpemUgZmlsZSAnXSAuICRjbG9uZS0+ZnVsbF9wYXRoIC4iJyIgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHB1c2ggQHdyaXRlX21lLCAkbG9uZ2xpbms7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB3cml0ZV9tZSwgJGNsb25lOwoKICAgICAgICAjIyMgd3JpdGUgdGhlIG9uZSwgb3B0aW9uYWxseSAyIGE6OnQ6OmZpbGUgb2JqZWN0cyB0byB0aGUgaGFuZGxlCiAgICAgICAgZm9yIG15ICRjbG9uZSAoQHdyaXRlX21lKSB7CgogICAgICAgICAgICAjIyMgaWYgdGhlIGZpbGUgaXMgYSBzeW1saW5rLCB0aGVyZSBhcmUgMiBvcHRpb25zOgogICAgICAgICAgICAjIyMgZWl0aGVyIHdlIGxlYXZlIHRoZSBzeW1saW5rIGludGFjdCwgYnV0IHRoZW4gd2UgZG9uJ3Qgd3JpdGUgYW55CiAgICAgICAgICAgICMjIyBkYXRhIE9SIHdlIGZvbGxvdyB0aGUgc3ltbGluaywgd2hpY2ggbWVhbnMgd2UgYWN0dWFsbHkgbWFrZSBhCiAgICAgICAgICAgICMjIyBjb3B5LiBpZiB3ZSBkbyB0aGUgbGF0dGVyLCB3ZSBoYXZlIHRvIGNoYW5nZSB0aGUgVFlQRSBvZiB0aGUKICAgICAgICAgICAgIyMjIGNsb25lIHRvICdGSUxFJwogICAgICAgICAgICBteSAkbGlua19vayA9ICAkY2xvbmUtPmlzX3N5bWxpbmsgJiYgJEFyY2hpdmU6OlRhcjo6Rk9MTE9XX1NZTUxJTks7CiAgICAgICAgICAgIG15ICRkYXRhX29rID0gISRjbG9uZS0+aXNfc3ltbGluayAmJiAkY2xvbmUtPmhhc19jb250ZW50OwoKICAgICAgICAgICAgIyMjIGRvd25ncmFkZSB0byBhICdub3JtYWwnIGZpbGUgaWYgaXQncyBhIHN5bWxpbmsgd2UncmUgZ29pbmcgdG8KICAgICAgICAgICAgIyMjIHRyZWF0IGFzIGEgcmVndWxhciBmaWxlCiAgICAgICAgICAgICRjbG9uZS0+X2Rvd25ncmFkZV90b19wbGFpbmZpbGUgaWYgJGxpbmtfb2s7CgogICAgICAgICAgICAjIyMgZ2V0IHRoZSBoZWFkZXIgZm9yIHRoaXMgYmxvY2sKICAgICAgICAgICAgbXkgJGhlYWRlciA9ICRzZWxmLT5fZm9ybWF0X3Rhcl9lbnRyeSggJGNsb25lICk7CiAgICAgICAgICAgIHVubGVzcyggJGhlYWRlciApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fZXJyb3IocVtDb3VsZCBub3QgZm9ybWF0IGhlYWRlciBmb3I6IF0gLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2xvbmUtPmZ1bGxfcGF0aCApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1bmxlc3MoIHByaW50ICRoYW5kbGUgJGhlYWRlciApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fZXJyb3IocVtDb3VsZCBub3Qgd3JpdGUgaGVhZGVyIGZvcjogXSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbG9uZS0+ZnVsbF9wYXRoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoICRsaW5rX29rIG9yICRkYXRhX29rICkgewogICAgICAgICAgICAgICAgdW5sZXNzKCBwcmludCAkaGFuZGxlICRjbG9uZS0+ZGF0YSApIHsKICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X2Vycm9yKHFbQ291bGQgbm90IHdyaXRlIGRhdGEgZm9yOiBdIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsb25lLT5mdWxsX3BhdGgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIyMgcGFkIHRoZSBlbmQgb2YgdGhlIGNsb25lIGlmIHJlcXVpcmVkICMjIwogICAgICAgICAgICAgICAgcHJpbnQgJGhhbmRsZSBUQVJfUEFELT4oICRjbG9uZS0+c2l6ZSApIGlmICRjbG9uZS0+c2l6ZSAlIEJMT0NLCiAgICAgICAgICAgIH0KCiAgICAgICAgfSAjIyMgZG9uZSB3cml0aW5nIHRoZXNlIGVudHJpZXMKICAgIH0KCiAgICAjIyMgd3JpdGUgdGhlIGVuZCBtYXJrZXJzICMjIwogICAgcHJpbnQgJGhhbmRsZSBUQVJfRU5EIHggMiBvcgogICAgICAgICAgICByZXR1cm4gJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IHdyaXRlIHRhciBlbmQgbWFya2Vyc10gKTsKCiAgICAjIyMgZGlkIHlvdSB3YW50IGl0IHdyaXR0ZW4gdG8gYSBmaWxlLCBvciByZXR1cm5lZCBhcyBhIHN0cmluZz8gIyMjCiAgICBteSAkcnYgPSAgbGVuZ3RoKCRmaWxlKSA/IDEKICAgICAgICAgICAgICAgICAgICAgICAgOiAkSEFTX1BFUkxJTyA/ICRkdW1teQogICAgICAgICAgICAgICAgICAgICAgICA6IGRvIHsgc2VlayAkaGFuZGxlLCAwLCAwOyBsb2NhbCAkLzsgPCRoYW5kbGU+IH07CgogICAgIyMjIG1ha2Ugc3VyZSB0byBjbG9zZSB0aGUgaGFuZGxlOwogICAgY2xvc2UgJGhhbmRsZTsKICAgIAogICAgcmV0dXJuICRydjsKfQoKc3ViIF9mb3JtYXRfdGFyX2VudHJ5IHsKICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OwogICAgbXkgJGVudHJ5ICAgICAgID0gc2hpZnQgb3IgcmV0dXJuOwogICAgbXkgJGV4dF9wcmVmaXggID0gc2hpZnQ7ICRleHRfcHJlZml4ID0gJycgdW5sZXNzIGRlZmluZWQgJGV4dF9wcmVmaXg7CiAgICBteSAkbm9fcHJlZml4ICAgPSBzaGlmdCB8fCAwOwoKICAgIG15ICRmaWxlICAgID0gJGVudHJ5LT5uYW1lOwogICAgbXkgJHByZWZpeCAgPSAkZW50cnktPnByZWZpeDsgJHByZWZpeCA9ICcnIHVubGVzcyBkZWZpbmVkICRwcmVmaXg7CgogICAgIyMjIHJlbW92ZSB0aGUgcHJlZml4IGZyb20gdGhlIGZpbGUgbmFtZQogICAgIyMjIG5vdCBzdXJlIGlmIHRoaXMgaXMgc3RpbGwgbmVlZWRlZCAtLWthbmUKICAgICMjIyBubyBpdCdzIG5vdCAtLSBBcmNoaXZlOjpUYXI6OkZpbGUtPl9uZXdfZnJvbV9maWxlIHdpbGwgdGFrZSBjYXJlIG9mCiAgICAjIyMgdGhpcyBmb3IgdXMuIEV2ZW4gd29yc2UsIHRoaXMgd291bGQgYnJlYWsgaWYgd2UgdHJpZWQgdG8gYWRkIGEgZmlsZQogICAgIyMjIGxpa2UgeC94LgogICAgI2lmKCBsZW5ndGggJHByZWZpeCApIHsKICAgICMgICAgJGZpbGUgPX4gcy9eJG1hdGNoLy87CiAgICAjfQoKICAgICRwcmVmaXggPSBGaWxlOjpTcGVjOjpVbml4LT5jYXRkaXIoJGV4dF9wcmVmaXgsICRwcmVmaXgpCiAgICAgICAgICAgICAgICBpZiBsZW5ndGggJGV4dF9wcmVmaXg7CgogICAgIyMjIG5vdCBzdXJlIHdoeSB0aGlzIGlzLi4uICMjIwogICAgbXkgJGwgPSBQUkVGSVhfTEVOR1RIOyAjIGlzIGFtYmlndW91cyBvdGhlcndpc2UuLi4KICAgIHN1YnN0ciAoJHByZWZpeCwgMCwgLSRsKSA9ICIiIGlmIGxlbmd0aCAkcHJlZml4ID49IFBSRUZJWF9MRU5HVEg7CgogICAgbXkgJGYxID0gIiUwNm8iOyBteSAkZjIgID0gIiUxMW8iOwoKICAgICMjIyB0aGlzIG1pZ2h0IGJlIG9wdGltaXphYmxlIHdpdGggYSAnY2hhbmdlZCcgZmxhZyBpbiB0aGUgZmlsZSBvYmplY3RzICMjIwogICAgbXkgJHRhciA9IHBhY2sgKAogICAgICAgICAgICAgICAgUEFDSywKICAgICAgICAgICAgICAgICRmaWxlLAoKICAgICAgICAgICAgICAgIChtYXAgeyBzcHJpbnRmKCAkZjEsICRlbnRyeS0+JF8oKSApIH0gcXdbbW9kZSB1aWQgZ2lkXSksCiAgICAgICAgICAgICAgICAobWFwIHsgc3ByaW50ZiggJGYyLCAkZW50cnktPiRfKCkgKSB9IHF3W3NpemUgbXRpbWVdKSwKCiAgICAgICAgICAgICAgICAiIiwgICMgY2hlY2tzdW0gZmllbGQgLSBzcGFjZSBwYWRkZWQgYSBiaXQgZG93bgoKICAgICAgICAgICAgICAgIChtYXAgeyAkZW50cnktPiRfKCkgfSAgICAgICAgICAgICAgICAgcXdbdHlwZSBsaW5rbmFtZSBtYWdpY10pLAoKICAgICAgICAgICAgICAgICRlbnRyeS0+dmVyc2lvbiB8fCBUQVJfVkVSU0lPTiwKCiAgICAgICAgICAgICAgICAobWFwIHsgJGVudHJ5LT4kXygpIH0gICAgICAgICAgICAgICAgIHF3W3VuYW1lIGduYW1lXSksCiAgICAgICAgICAgICAgICAobWFwIHsgc3ByaW50ZiggJGYxLCAkZW50cnktPiRfKCkgKSB9IHF3W2Rldm1ham9yIGRldm1pbm9yXSksCgogICAgICAgICAgICAgICAgKCRub19wcmVmaXggPyAnJyA6ICRwcmVmaXgpCiAgICApOwoKICAgICMjIyBhZGQgdGhlIGNoZWNrc3VtICMjIwogICAgc3Vic3RyKCR0YXIsMTQ4LDcpID0gc3ByaW50ZigiJTZvXDAiLCB1bnBhY2soIiUxNkMqIiwkdGFyKSk7CgogICAgcmV0dXJuICR0YXI7Cn0KCj1oZWFkMiAkdGFyLT5hZGRfZmlsZXMoIEBmaWxlbmFtZWxpc3QgKQoKVGFrZXMgYSBsaXN0IG9mIGZpbGVuYW1lcyBhbmQgYWRkcyB0aGVtIHRvIHRoZSBpbi1tZW1vcnkgYXJjaGl2ZS4KClRoZSBwYXRoIHRvIHRoZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGEgVW5peCBsaWtlCmVxdWl2YWxlbnQgZm9yIHVzZSBpbiB0aGUgYXJjaGl2ZSwgYW5kLCBpZiBvbiBNYWNPUywgdGhlIGZpbGUncwptb2RpZmljYXRpb24gdGltZSBpcyBjb252ZXJ0ZWQgZnJvbSB0aGUgTWFjT1MgZXBvY2ggdG8gdGhlIFVuaXggZXBvY2guClNvIHRhciBhcmNoaXZlcyBjcmVhdGVkIG9uIE1hY09TIHdpdGggQjxBcmNoaXZlOjpUYXI+IGNhbiBiZSByZWFkCmJvdGggd2l0aCBJPHRhcj4gb24gVW5peCBhbmQgYXBwbGljYXRpb25zIGxpa2UgSTxzdW50YXI+IG9yCkk8U3R1ZmZpdCBFeHBhbmRlcj4gb24gTWFjT1MuCgpCZSBhd2FyZSB0aGF0IHRoZSBmaWxlJ3MgdHlwZS9jcmVhdG9yIGFuZCByZXNvdXJjZSBmb3JrIHdpbGwgYmUgbG9zdCwKd2hpY2ggaXMgdXN1YWxseSB3aGF0IHlvdSB3YW50IGluIGNyb3NzLXBsYXRmb3JtIGFyY2hpdmVzLgoKUmV0dXJucyBhIGxpc3Qgb2YgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IG9iamVjdHMgdGhhdCB3ZXJlIGp1c3QgYWRkZWQuCgo9Y3V0CgpzdWIgYWRkX2ZpbGVzIHsKICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CiAgICBteSBAZmlsZXMgICA9IEBfIG9yIHJldHVybjsKCiAgICBteSBAcnY7CiAgICBmb3IgbXkgJGZpbGUgKCBAZmlsZXMgKSB7CiAgICAgICAgdW5sZXNzKCAtZSAkZmlsZSB8fCAtbCAkZmlsZSApIHsKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbTm8gc3VjaCBmaWxlOiAnJGZpbGUnXSApOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgbXkgJG9iaiA9IEFyY2hpdmU6OlRhcjo6RmlsZS0+bmV3KCBmaWxlID0+ICRmaWxlICk7CiAgICAgICAgdW5sZXNzKCAkb2JqICkgewogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtVbmFibGUgdG8gYWRkIGZpbGU6ICckZmlsZSddICk7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBydiwgJG9iajsKICAgIH0KCiAgICBwdXNoIEB7JHNlbGYtPntfZGF0YX19LCBAcnY7CgogICAgcmV0dXJuIEBydjsKfQoKPWhlYWQyICR0YXItPmFkZF9kYXRhICggJGZpbGVuYW1lLCAkZGF0YSwgWyRvcHRoYXNocmVmXSApCgpUYWtlcyBhIGZpbGVuYW1lLCBhIHNjYWxhciBmdWxsIG9mIGRhdGEgYW5kIG9wdGlvbmFsbHkgYSByZWZlcmVuY2UgdG8KYSBoYXNoIHdpdGggc3BlY2lmaWMgb3B0aW9ucy4KCldpbGwgYWRkIGEgZmlsZSB0byB0aGUgaW4tbWVtb3J5IGFyY2hpdmUsIHdpdGggbmFtZSBDPCRmaWxlbmFtZT4gYW5kCmNvbnRlbnQgQzwkZGF0YT4uIFNwZWNpZmljIHByb3BlcnRpZXMgY2FuIGJlIHNldCB1c2luZyBDPCRvcHRoYXNocmVmPi4KVGhlIGZvbGxvd2luZyBsaXN0IG9mIHByb3BlcnRpZXMgaXMgc3VwcG9ydGVkOiBuYW1lLCBzaXplLCBtdGltZQoobGFzdCBtb2RpZmllZCBkYXRlKSwgbW9kZSwgdWlkLCBnaWQsIGxpbmtuYW1lLCB1bmFtZSwgZ25hbWUsCmRldm1ham9yLCBkZXZtaW5vciwgcHJlZml4LCB0eXBlLiAgKE9uIE1hY09TLCB0aGUgZmlsZSdzIHBhdGggYW5kCm1vZGlmaWNhdGlvbiB0aW1lcyBhcmUgY29udmVydGVkIHRvIFVuaXggZXF1aXZhbGVudHMuKQoKVmFsaWQgdmFsdWVzIGZvciB0aGUgZmlsZSB0eXBlIGFyZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmVkIGluCkFyY2hpdmU6OlRhcjo6Q29uc3RhbnRzOgoKPW92ZXIgNAoKPWl0ZW0gRklMRQoKUmVndWxhciBmaWxlLgoKPWl0ZW0gSEFSRExJTksKCj1pdGVtIFNZTUxJTksKCkhhcmQgYW5kIHN5bWJvbGljICgic29mdCIpIGxpbmtzOyBsaW5rbmFtZSBzaG91bGQgc3BlY2lmeSB0YXJnZXQuCgo9aXRlbSBDSEFSREVWCgo9aXRlbSBCTE9DS0RFVgoKQ2hhcmFjdGVyIGFuZCBibG9jayBkZXZpY2VzLiBkZXZtYWpvciBhbmQgZGV2bWlub3Igc2hvdWxkIHNwZWNpZnkgdGhlIG1ham9yCmFuZCBtaW5vciBkZXZpY2UgbnVtYmVycy4KCj1pdGVtIERJUgoKRGlyZWN0b3J5LgoKPWl0ZW0gRklGTwoKRklGTyAobmFtZWQgcGlwZSkuCgo9aXRlbSBTT0NLRVQKClNvY2tldC4KCj1iYWNrCgpSZXR1cm5zIHRoZSBDPEFyY2hpdmU6OlRhcjo6RmlsZT4gb2JqZWN0IHRoYXQgd2FzIGp1c3QgYWRkZWQsIG9yCkM8dW5kZWY+IG9uIGZhaWx1cmUuCgo9Y3V0CgpzdWIgYWRkX2RhdGEgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICgkZmlsZSwgJGRhdGEsICRvcHQpID0gQF87CgogICAgbXkgJG9iaiA9IEFyY2hpdmU6OlRhcjo6RmlsZS0+bmV3KCBkYXRhID0+ICRmaWxlLCAkZGF0YSwgJG9wdCApOwogICAgdW5sZXNzKCAkb2JqICkgewogICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW1VuYWJsZSB0byBhZGQgZmlsZTogJyRmaWxlJ10gKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcHVzaCBAeyRzZWxmLT57X2RhdGF9fSwgJG9iajsKCiAgICByZXR1cm4gJG9iajsKfQoKPWhlYWQyICR0YXItPmVycm9yKCBbJEJPT0xdICkKClJldHVybnMgdGhlIGN1cnJlbnQgZXJyb3JzdHJpbmcgKHVzdWFsbHksIHRoZSBsYXN0IGVycm9yIHJlcG9ydGVkKS4KSWYgYSB0cnVlIHZhbHVlIHdhcyBzcGVjaWZpZWQsIGl0IHdpbGwgZ2l2ZSB0aGUgQzxDYXJwOjpsb25nbWVzcz4KZXF1aXZhbGVudCBvZiB0aGUgZXJyb3IsIGluIGVmZmVjdCBnaXZpbmcgeW91IGEgc3RhY2t0cmFjZS4KCkZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhpcyBlcnJvciBpcyBhbHNvIGF2YWlsYWJsZSBhcwpDPCRBcmNoaXZlOjpUYXI6OmVycm9yPiBhbHRob3VnaCBpdCBpcyBtdWNoIHJlY29tbWVuZGVkIHlvdSB1c2UgdGhlCm1ldGhvZCBjYWxsIGluc3RlYWQuCgo9Y3V0Cgp7CiAgICAkZXJyb3IgPSAnJzsKICAgIG15ICRsb25nbWVzczsKCiAgICBzdWIgX2Vycm9yIHsKICAgICAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgICAgIG15ICRtc2cgICAgID0gJGVycm9yID0gc2hpZnQ7CiAgICAgICAgJGxvbmdtZXNzICAgPSBDYXJwOjpsb25nbWVzcygkZXJyb3IpOwoKICAgICAgICAjIyMgc2V0IEFyY2hpdmU6OlRhcjo6V0FSTiB0byAwIHRvIGRpc2FibGUgcHJpbnRpbmcKICAgICAgICAjIyMgb2YgZXJyb3JzCiAgICAgICAgaWYoICRXQVJOICkgewogICAgICAgICAgICBjYXJwICRERUJVRyA/ICRsb25nbWVzcyA6ICRtc2c7CiAgICAgICAgfQoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgc3ViIGVycm9yIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgIHJldHVybiBzaGlmdCgpID8gJGxvbmdtZXNzIDogJGVycm9yOwogICAgfQp9Cgo9aGVhZDIgJHRhci0+c2V0Y3dkKCAkY3dkICk7CgpDPEFyY2hpdmU6OlRhcj4gbmVlZHMgdG8ga25vdyB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCBpdCB3aWxsIHJ1bgpDPEN3ZDo6Y3dkKCk+IEk8ZXZlcnk+IHRpbWUgaXQgZXh0cmFjdHMgYSBJPHJlbGF0aXZlPiBlbnRyeSBmcm9tIHRoZSAKdGFyZmlsZSBhbmQgc2F2ZXMgaXQgaW4gdGhlIGZpbGUgc3lzdGVtLiAoQXMgb2YgdmVyc2lvbiAxLjMwLCBob3dldmVyLApDPEFyY2hpdmU6OlRhcj4gd2lsbCB1c2UgdGhlIHNwZWVkIG9wdGltaXphdGlvbiBkZXNjcmliZWQgYmVsb3cgCmF1dG9tYXRpY2FsbHksIHNvIGl0J3Mgb25seSByZWxldmFudCBpZiB5b3UncmUgdXNpbmcgQzxleHRyYWN0X2ZpbGUoKT4pLgoKU2luY2UgQzxBcmNoaXZlOjpUYXI+IGRvZXNuJ3QgY2hhbmdlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbnRlcm5hbGx5CndoaWxlIGl0IGlzIGV4dHJhY3RpbmcgdGhlIGl0ZW1zIGluIGEgdGFyYmFsbCwgYWxsIGNhbGxzIHRvIEM8Q3dkOjpjd2QoKT4KY2FuIGJlIGF2b2lkZWQgaWYgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBkb2Vzbid0CmdldCBjaGFuZ2VkIGV4dGVybmFsbHkuCgpUbyB1c2UgdGhpcyBwZXJmb3JtYW5jZSBib29zdCwgc2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSB2aWEKCiAgICB1c2UgQ3dkOwogICAgJHRhci0+c2V0Y3dkKCBjd2QoKSApOwoKb25jZSBiZWZvcmUgY2FsbGluZyBhIGZ1bmN0aW9uIGxpa2UgQzxleHRyYWN0X2ZpbGU+IGFuZApDPEFyY2hpdmU6OlRhcj4gd2lsbCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNldHRpbmcgZnJvbSB0aGVuIG9uCmFuZCB3b24ndCBjYWxsIEM8Q3dkOjpjd2QoKT4gaW50ZXJuYWxseS4gCgpUbyBzd2l0Y2ggYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvdXIsIHVzZQoKICAgICR0YXItPnNldGN3ZCggdW5kZWYgKTsKCmFuZCBDPEFyY2hpdmU6OlRhcj4gd2lsbCBjYWxsIEM8Q3dkOjpjd2QoKT4gaW50ZXJuYWxseSBhZ2Fpbi4KCklmIHlvdSdyZSB1c2luZyBDPEFyY2hpdmU6OlRhcj4ncyBDPGV4cmFjdCgpPiBtZXRob2QsIEM8c2V0Y3dkKCk+IHdpbGwKYmUgY2FsbGVkIGZvciB5b3UuCgo9Y3V0IAoKc3ViIHNldGN3ZCB7CiAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKICAgIG15ICRjd2QgICAgICA9IHNoaWZ0OwoKICAgICRzZWxmLT57Y3dkfSA9ICRjd2Q7Cn0KCj1oZWFkMiAkYm9vbCA9ICR0YXItPmhhc19pb19zdHJpbmcKClJldHVybnMgdHJ1ZSBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBDPElPOjpTdHJpbmc+IHN1cHBvcnQgbG9hZGVkLgoKRWl0aGVyIEM8SU86OlN0cmluZz4gb3IgQzxwZXJsaW8+IHN1cHBvcnQgaXMgbmVlZGVkIHRvIHN1cHBvcnQgd3JpdGluZyAKc3RyaW5naWZpZWQgYXJjaGl2ZXMuIEN1cnJlbnRseSwgQzxwZXJsaW8+IGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kLCBpZgphdmFpbGFibGUuCgpTZWUgdGhlIEM8R0xPQkFMIFZBUklBQkxFUz4gc2VjdGlvbiB0byBzZWUgaG93IHRvIGNoYW5nZSB0aGlzIHByZWZlcmVuY2UuCgo9Y3V0CgpzdWIgaGFzX2lvX3N0cmluZyB7IHJldHVybiAkSEFTX0lPX1NUUklORzsgfQoKPWhlYWQyICRib29sID0gJHRhci0+aGFzX3BlcmxpbwoKUmV0dXJucyB0cnVlIGlmIHdlIGN1cnJlbnRseSBoYXZlIEM8cGVybGlvPiBzdXBwb3J0IGxvYWRlZC4KClRoaXMgcmVxdWlyZXMgQzxwZXJsLTUuOD4gb3IgaGlnaGVyLCBjb21waWxlZCB3aXRoIEM8cGVybGlvPiAKCkVpdGhlciBDPElPOjpTdHJpbmc+IG9yIEM8cGVybGlvPiBzdXBwb3J0IGlzIG5lZWRlZCB0byBzdXBwb3J0IHdyaXRpbmcgCnN0cmluZ2lmaWVkIGFyY2hpdmVzLiBDdXJyZW50bHksIEM8cGVybGlvPiBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCwgaWYKYXZhaWxhYmxlLgoKU2VlIHRoZSBDPEdMT0JBTCBWQVJJQUJMRVM+IHNlY3Rpb24gdG8gc2VlIGhvdyB0byBjaGFuZ2UgdGhpcyBwcmVmZXJlbmNlLgoKPWN1dAoKc3ViIGhhc19wZXJsaW8geyByZXR1cm4gJEhBU19QRVJMSU87IH0KCgo9aGVhZDEgQ2xhc3MgTWV0aG9kcwoKPWhlYWQyIEFyY2hpdmU6OlRhci0+Y3JlYXRlX2FyY2hpdmUoJGZpbGUsICRjb21wcmVzc2lvbiwgQGZpbGVsaXN0KQoKQ3JlYXRlcyBhIHRhciBmaWxlIGZyb20gdGhlIGxpc3Qgb2YgZmlsZXMgcHJvdmlkZWQuICBUaGUgZmlyc3QKYXJndW1lbnQgY2FuIGVpdGhlciBiZSB0aGUgbmFtZSBvZiB0aGUgdGFyIGZpbGUgdG8gY3JlYXRlIG9yIGEKcmVmZXJlbmNlIHRvIGFuIG9wZW4gZmlsZSBoYW5kbGUgKGUuZy4gYSBHTE9CIHJlZmVyZW5jZSkuCgpUaGUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb24gdG8gYmUgdXNlZCwgaWYKYW55LiAgQ29tcHJlc3Npb24gb2YgdGFyIGZpbGVzIHJlcXVpcmVzIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlCklPOjpabGliIG1vZHVsZS4gIFNwZWNpZmljIGxldmVscyBvZiBjb21wcmVzc2lvbiBtYXkgYmUKcmVxdWVzdGVkIGJ5IHBhc3NpbmcgYSB2YWx1ZSBiZXR3ZWVuIDIgYW5kIDkgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4KQW55IG90aGVyIHZhbHVlIGV2YWx1YXRpbmcgYXMgdHJ1ZSB3aWxsIHJlc3VsdCBpbiB0aGUgZGVmYXVsdApjb21wcmVzc2lvbiBsZXZlbCBiZWluZyB1c2VkLgoKTm90ZSB0aGF0IHdoZW4geW91IHBhc3MgaW4gYSBmaWxlaGFuZGxlLCB0aGUgY29tcHJlc3Npb24gYXJndW1lbnQKaXMgaWdub3JlZCwgYXMgYWxsIGZpbGVzIGFyZSBwcmludGVkIHZlcmJhdGltIHRvIHlvdXIgZmlsZWhhbmRsZS4KSWYgeW91IHdpc2ggdG8gZW5hYmxlIGNvbXByZXNzaW9uIHdpdGggZmlsZWhhbmRsZXMsIHVzZSBhbgpDPElPOjpabGliPiBmaWxlaGFuZGxlIGluc3RlYWQuCgpUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBsaXN0IHRoZSBmaWxlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgdGFyIGZpbGUuClRoZXNlIGZpbGVzIG11c3QgYWxsIGV4aXN0LiBBbnkgZmlsZXMgd2hpY2ggZG9uJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUKcmVhZCBhcmUgc2lsZW50bHkgaWdub3JlZC4KCklmIHRoZSBhcmNoaXZlIGNyZWF0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLCBDPGNyZWF0ZV9hcmNoaXZlPiB3aWxsCnJldHVybiBmYWxzZS4gUGxlYXNlIHVzZSB0aGUgQzxlcnJvcj4gbWV0aG9kIHRvIGZpbmQgdGhlIGNhdXNlIG9mIHRoZQpmYWlsdXJlLgoKTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHdyaXRlIEM8b24gdGhlIGZseT4gYXMgaXQgd2VyZTsgaXQKc3RpbGwgcmVhZHMgYWxsIHRoZSBmaWxlcyBpbnRvIG1lbW9yeSBiZWZvcmUgd3JpdGluZyBvdXQgdGhlIGFyY2hpdmUuCkNvbnN1bHQgdGhlIEZBUSBiZWxvdyBpZiB0aGlzIGlzIGEgcHJvYmxlbS4KCj1jdXQKCnN1YiBjcmVhdGVfYXJjaGl2ZSB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKCiAgICBteSAkZmlsZSAgICA9IHNoaWZ0OyByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkZ3ppcCAgICA9IHNoaWZ0IHx8IDA7CiAgICBteSBAZmlsZXMgICA9IEBfOwoKICAgIHVubGVzcyggQGZpbGVzICkgewogICAgICAgIHJldHVybiAkY2xhc3MtPl9lcnJvciggcXFbQ293YXJkbHkgcmVmdXNpbmcgdG8gY3JlYXRlIGVtcHR5IGFyY2hpdmUhXSApOwogICAgfQoKICAgIG15ICR0YXIgPSAkY2xhc3MtPm5ldzsKICAgICR0YXItPmFkZF9maWxlcyggQGZpbGVzICk7CiAgICByZXR1cm4gJHRhci0+d3JpdGUoICRmaWxlLCAkZ3ppcCApOwp9Cgo9aGVhZDIgQXJjaGl2ZTo6VGFyLT5saXN0X2FyY2hpdmUgKCRmaWxlLCAkY29tcHJlc3NlZCwgW1xAcHJvcGVydGllc10pCgpSZXR1cm5zIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZS4gIFRoZQpmaXJzdCBhcmd1bWVudCBjYW4gZWl0aGVyIGJlIHRoZSBuYW1lIG9mIHRoZSB0YXIgZmlsZSB0byBsaXN0IG9yIGEKcmVmZXJlbmNlIHRvIGFuIG9wZW4gZmlsZSBoYW5kbGUgKGUuZy4gYSBHTE9CIHJlZmVyZW5jZSkuCgpJZiBDPGxpc3RfYXJjaGl2ZSgpPiBpcyBwYXNzZWQgYW4gYXJyYXkgcmVmZXJlbmNlIGFzIGl0cyB0aGlyZAphcmd1bWVudCBpdCByZXR1cm5zIGEgbGlzdCBvZiBoYXNoIHJlZmVyZW5jZXMgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkCnByb3BlcnRpZXMgb2YgZWFjaCBmaWxlLiAgVGhlIGZvbGxvd2luZyBsaXN0IG9mIHByb3BlcnRpZXMgaXMKc3VwcG9ydGVkOiBmdWxsX3BhdGgsIG5hbWUsIHNpemUsIG10aW1lIChsYXN0IG1vZGlmaWVkIGRhdGUpLCBtb2RlLCAKdWlkLCBnaWQsIGxpbmtuYW1lLCB1bmFtZSwgZ25hbWUsIGRldm1ham9yLCBkZXZtaW5vciwgcHJlZml4LgoKU2VlIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBmb3IgZGV0YWlscyBhYm91dCBzdXBwb3J0ZWQgcHJvcGVydGllcy4KClBhc3NpbmcgYW4gYXJyYXkgcmVmZXJlbmNlIGNvbnRhaW5pbmcgb25seSBvbmUgZWxlbWVudCwgJ25hbWUnLCBpcwpzcGVjaWFsIGNhc2VkIHRvIHJldHVybiBhIGxpc3Qgb2YgbmFtZXMgcmF0aGVyIHRoYW4gYSBsaXN0IG9mIGhhc2gKcmVmZXJlbmNlcy4KCj1jdXQKCnN1YiBsaXN0X2FyY2hpdmUgewogICAgbXkgJGNsYXNzICAgPSBzaGlmdDsKICAgIG15ICRmaWxlICAgID0gc2hpZnQ7IHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZmlsZTsKICAgIG15ICRnemlwICAgID0gc2hpZnQgfHwgMDsKCiAgICBteSAkdGFyID0gJGNsYXNzLT5uZXcoJGZpbGUsICRnemlwKTsKICAgIHJldHVybiB1bmxlc3MgJHRhcjsKCiAgICByZXR1cm4gJHRhci0+bGlzdF9maWxlcyggQF8gKTsKfQoKPWhlYWQyIEFyY2hpdmU6OlRhci0+ZXh0cmFjdF9hcmNoaXZlICgkZmlsZSwgJGd6aXApCgpFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgdGhlIHRhciBmaWxlLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBlaXRoZXIKYmUgdGhlIG5hbWUgb2YgdGhlIHRhciBmaWxlIHRvIGNyZWF0ZSBvciBhIHJlZmVyZW5jZSB0byBhbiBvcGVuIGZpbGUKaGFuZGxlIChlLmcuIGEgR0xPQiByZWZlcmVuY2UpLiAgQWxsIHJlbGF0aXZlIHBhdGhzIGluIHRoZSB0YXIgZmlsZSB3aWxsCmJlIGNyZWF0ZWQgdW5kZXJuZWF0aCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KCkM8ZXh0cmFjdF9hcmNoaXZlPiB3aWxsIHJldHVybiBhIGxpc3Qgb2YgZmlsZXMgaXQgZXh0cmFjdGVkLgpJZiB0aGUgYXJjaGl2ZSBleHRyYWN0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLCBDPGV4dHJhY3RfYXJjaGl2ZT4Kd2lsbCByZXR1cm4gZmFsc2UuICBQbGVhc2UgdXNlIHRoZSBDPGVycm9yPiBtZXRob2QgdG8gZmluZCB0aGUgY2F1c2UKb2YgdGhlIGZhaWx1cmUuCgo9Y3V0CgpzdWIgZXh0cmFjdF9hcmNoaXZlIHsKICAgIG15ICRjbGFzcyAgID0gc2hpZnQ7CiAgICBteSAkZmlsZSAgICA9IHNoaWZ0OyByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkZ3ppcCAgICA9IHNoaWZ0IHx8IDA7CgogICAgbXkgJHRhciA9ICRjbGFzcy0+bmV3KCApIG9yIHJldHVybjsKCiAgICByZXR1cm4gJHRhci0+cmVhZCggJGZpbGUsICRnemlwLCB7IGV4dHJhY3QgPT4gMSB9ICk7Cn0KCj1oZWFkMiBBcmNoaXZlOjpUYXItPmNhbl9oYW5kbGVfY29tcHJlc3NlZF9maWxlcwoKQSBzaW1wbGUgY2hlY2tpbmcgcm91dGluZSwgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBpZiBDPEFyY2hpdmU6OlRhcj4KaXMgYWJsZSB0byB1bmNvbXByZXNzIGNvbXByZXNzZWQgYXJjaGl2ZXMgb24gdGhlIGZseSB3aXRoIEM8SU86OlpsaWI+LApvciBmYWxzZSBpZiBDPElPOjpabGliPiBpcyBub3QgaW5zdGFsbGVkLgoKWW91IGNhbiB1c2UgdGhpcyBhcyBhIHNob3J0Y3V0IHRvIGRldGVybWluZSB3aGV0aGVyIEM8QXJjaGl2ZTo6VGFyPgp3aWxsIGRvIHdoYXQgeW91IHRoaW5rIGJlZm9yZSBwYXNzaW5nIGNvbXByZXNzZWQgYXJjaGl2ZXMgdG8gaXRzCkM8cmVhZD4gbWV0aG9kLgoKPWN1dAoKc3ViIGNhbl9oYW5kbGVfY29tcHJlc3NlZF9maWxlcyB7IHJldHVybiBaTElCID8gMSA6IDAgfQoKc3ViIG5vX3N0cmluZ19zdXBwb3J0IHsKICAgIGNyb2FrKCJZb3UgaGF2ZSB0byBpbnN0YWxsIElPOjpTdHJpbmcgdG8gc3VwcG9ydCB3cml0aW5nIGFyY2hpdmVzIHRvIHN0cmluZ3MiKTsKfQoKMTsKCl9fRU5EX18KCj1oZWFkMSBHTE9CQUwgVkFSSUFCTEVTCgo9aGVhZDIgJEFyY2hpdmU6OlRhcjo6Rk9MTE9XX1NZTUxJTksKClNldCB0aGlzIHZhcmlhYmxlIHRvIEM8MT4gdG8gbWFrZSBDPEFyY2hpdmU6OlRhcj4gZWZmZWN0aXZlbHkgbWFrZSBhCmNvcHkgb2YgdGhlIGZpbGUgd2hlbiBleHRyYWN0aW5nLiBEZWZhdWx0IGlzIEM8MD4sIHdoaWNoCm1lYW5zIHRoZSBzeW1saW5rIHN0YXlzIGludGFjdC4gT2YgY291cnNlLCB5b3Ugd2lsbCBoYXZlIHRvIHBhY2sgdGhlCmZpbGUgbGlua2VkIHRvIGFzIHdlbGwuCgpUaGlzIG9wdGlvbiBpcyBjaGVja2VkIHdoZW4geW91IHdyaXRlIG91dCB0aGUgdGFyZmlsZSB1c2luZyBDPHdyaXRlPgpvciBDPGNyZWF0ZV9hcmNoaXZlPi4KClRoaXMgd29ya3MganVzdCBsaWtlIEM8L2Jpbi90YXI+J3MgQzwtaD4gb3B0aW9uLgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkNIT1dOCgpCeSBkZWZhdWx0LCBDPEFyY2hpdmU6OlRhcj4gd2lsbCB0cnkgdG8gQzxjaG93bj4geW91ciBmaWxlcyBpZiBpdCBpcwphYmxlIHRvLiBJbiBzb21lIGNhc2VzLCB0aGlzIG1heSBub3QgYmUgZGVzaXJlZC4gSW4gdGhhdCBjYXNlLCBzZXQKdGhpcyB2YXJpYWJsZSB0byBDPDA+IHRvIGRpc2FibGUgQzxjaG93bj4taW5nLCBldmVuIGlmIGl0IHdlcmUKcG9zc2libGUuCgpUaGUgZGVmYXVsdCBpcyBDPDE+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkNITU9ECgpCeSBkZWZhdWx0LCBDPEFyY2hpdmU6OlRhcj4gd2lsbCB0cnkgdG8gQzxjaG1vZD4geW91ciBmaWxlcyB0bwp3aGF0ZXZlciBtb2RlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIGZpbGUgaW4gdGhlIGFyY2hpdmUuCkluIHNvbWUgY2FzZXMsIHRoaXMgbWF5IG5vdCBiZSBkZXNpcmVkLiBJbiB0aGF0IGNhc2UsIHNldCB0aGlzCnZhcmlhYmxlIHRvIEM8MD4gdG8gZGlzYWJsZSBDPGNobW9kPi1pbmcuCgpUaGUgZGVmYXVsdCBpcyBDPDE+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkRPX05PVF9VU0VfUFJFRklYCgpCeSBkZWZhdWx0LCBDPEFyY2hpdmU6OlRhcj4gd2lsbCB0cnkgdG8gcHV0IHBhdGhzIHRoYXQgYXJlIG92ZXIgCjEwMCBjaGFyYWN0ZXJzIGluIHRoZSBDPHByZWZpeD4gZmllbGQgb2YgeW91ciB0YXIgaGVhZGVyLCBhcwpkZWZpbmVkIHBlciBQT1NJWC1zdGFuZGFyZC4gSG93ZXZlciwgc29tZSAob2xkZXIpIHRhciBwcm9ncmFtcyAKZG8gbm90IGltcGxlbWVudCB0aGlzIHNwZWMuIFRvIHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlc2Ugb2xkZXIgCm9yIG5vbi1QT1NJWCBjb21wbGlhbnQgdmVyc2lvbnMsIHlvdSBjYW4gc2V0IHRoZSBDPCRET19OT1RfVVNFX1BSRUZJWD4gCnZhcmlhYmxlIHRvIGEgdHJ1ZSB2YWx1ZSwgYW5kIEM8QXJjaGl2ZTo6VGFyPiB3aWxsIHVzZSBhbiBhbHRlcm5hdGUgCndheSBvZiBkZWFsaW5nIHdpdGggcGF0aHMgb3ZlciAxMDAgY2hhcmFjdGVycyBieSB1c2luZyB0aGUgCkM8R05VIEV4dGVuZGVkIEhlYWRlcj4gZmVhdHVyZS4KCk5vdGUgdGhhdCBjbGllbnRzIHdobyBkbyBub3Qgc3VwcG9ydCB0aGUgQzxHTlUgRXh0ZW5kZWQgSGVhZGVyPgpmZWF0dXJlIHdpbGwgbm90IGJlIGFibGUgdG8gcmVhZCB0aGVzZSBhcmNoaXZlcy4gU3VjaCBjbGllbnRzIGluY2x1ZGUKdGFycyBvbiBDPFNvbGFyaXM+LCBDPElyaXg+IGFuZCBDPEFJWD4uCgpUaGUgZGVmYXVsdCBpcyBDPDA+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkRFQlVHCgpTZXQgdGhpcyB2YXJpYWJsZSB0byBDPDE+IHRvIGFsd2F5cyBnZXQgdGhlIEM8Q2FycDo6bG9uZ21lc3M+IG91dHB1dApvZiB0aGUgd2FybmluZ3MsIGluc3RlYWQgb2YgdGhlIHJlZ3VsYXIgQzxjYXJwPi4gVGhpcyBpcyB0aGUgc2FtZQptZXNzYWdlIHlvdSB3b3VsZCBnZXQgYnkgZG9pbmc6CgogICAgJHRhci0+ZXJyb3IoMSk7CgpEZWZhdWx0cyB0byBDPDA+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OldBUk4KClNldCB0aGlzIHZhcmlhYmxlIHRvIEM8MD4gaWYgeW91IGRvIG5vdCB3YW50IGFueSB3YXJuaW5ncyBwcmludGVkLgpQZXJzb25hbGx5IEkgcmVjb21tZW5kIGFnYWluc3QgZG9pbmcgdGhpcywgYnV0IHBlb3BsZSBhc2tlZCBmb3IgdGhlCm9wdGlvbi4gQWxzbywgYmUgYWR2aXNlZCB0aGF0IHRoaXMgaXMgb2YgY291cnNlIG5vdCB0aHJlYWRzYWZlLgoKRGVmYXVsdHMgdG8gQzwxPi4KCj1oZWFkMiAkQXJjaGl2ZTo6VGFyOjplcnJvcgoKSG9sZHMgdGhlIGxhc3QgcmVwb3J0ZWQgZXJyb3IuIEtlcHQgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgYnV0IGl0cwp1c2UgaXMgdmVyeSBtdWNoIGRpc2NvdXJhZ2VkLiBVc2UgdGhlIEM8ZXJyb3IoKT4gbWV0aG9kIGluc3RlYWQ6CgogICAgd2FybiAkdGFyLT5lcnJvciB1bmxlc3MgJHRhci0+ZXh0cmFjdDsKCj1oZWFkMiAkQXJjaGl2ZTo6VGFyOjpIQVNfUEVSTElPCgpUaGlzIHZhcmlhYmxlIGhvbGRzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHdlIGN1cnJlbnRseSBoYXZlIApDPHBlcmxpbz4gc3VwcG9ydCBsb2FkZWQuIFRoaXMgd2lsbCBiZSBlbmFibGVkIGZvciBhbnkgcGVybApncmVhdGVyIHRoYW4gQzw1Ljg+IGNvbXBpbGVkIHdpdGggQzxwZXJsaW8+LiAKCklmIHlvdSBmZWVsIHN0cm9uZ2x5IGFib3V0IGRpc2FibGluZyBpdCwgc2V0IHRoaXMgdmFyaWFibGUgdG8KQzxmYWxzZT4uIE5vdGUgdGhhdCB5b3Ugd2lsbCB0aGVuIG5lZWQgQzxJTzo6U3RyaW5nPiBpbnN0YWxsZWQKdG8gc3VwcG9ydCB3cml0aW5nIHN0cmluZ2lmaWVkIGFyY2hpdmVzLgoKRG9uJ3QgY2hhbmdlIHRoaXMgdmFyaWFibGUgdW5sZXNzIHlvdSBCPHJlYWxseT4ga25vdyB3aGF0IHlvdSdyZQpkb2luZy4KCj1oZWFkMiAkQXJjaGl2ZTo6VGFyOjpIQVNfSU9fU1RSSU5HCgpUaGlzIHZhcmlhYmxlIGhvbGRzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHdlIGN1cnJlbnRseSBoYXZlIApDPElPOjpTdHJpbmc+IHN1cHBvcnQgbG9hZGVkLiBUaGlzIHdpbGwgYmUgZW5hYmxlZCBmb3IgYW55IHBlcmwKdGhhdCBoYXMgYSBsb2FkYWJsZSBDPElPOjpTdHJpbmc+IG1vZHVsZS4KCklmIHlvdSBmZWVsIHN0cm9uZ2x5IGFib3V0IGRpc2FibGluZyBpdCwgc2V0IHRoaXMgdmFyaWFibGUgdG8KQzxmYWxzZT4uIE5vdGUgdGhhdCB5b3Ugd2lsbCB0aGVuIG5lZWQgQzxwZXJsaW8+IHN1cHBvcnQgZnJvbQp5b3VyIHBlcmwgdG8gYmUgYWJsZSB0byAgd3JpdGUgc3RyaW5naWZpZWQgYXJjaGl2ZXMuCgpEb24ndCBjaGFuZ2UgdGhpcyB2YXJpYWJsZSB1bmxlc3MgeW91IEI8cmVhbGx5PiBrbm93IHdoYXQgeW91J3JlCmRvaW5nLgoKPWhlYWQxIEZBUQoKPW92ZXIgNAoKPWl0ZW0gV2hhdCdzIHRoZSBtaW5pbXVtIHBlcmwgdmVyc2lvbiByZXF1aXJlZCB0byBydW4gQXJjaGl2ZTo6VGFyPwoKWW91IHdpbGwgbmVlZCBwZXJsIHZlcnNpb24gNS4wMDVfMDMgb3IgbmV3ZXIuCgo9aXRlbSBJc24ndCBBcmNoaXZlOjpUYXIgc2xvdz8KClllcyBpdCBpcy4gSXQncyBwdXJlIHBlcmwsIHNvIGl0J3MgYSBsb3Qgc2xvd2VyIHRoZW4geW91ciBDPC9iaW4vdGFyPgpIb3dldmVyLCBpdCdzIHZlcnkgcG9ydGFibGUuIElmIHNwZWVkIGlzIGFuIGlzc3VlLCBjb25zaWRlciB1c2luZwpDPC9iaW4vdGFyPiBpbnN0ZWFkLgoKPWl0ZW0gSXNuJ3QgQXJjaGl2ZTo6VGFyIGhlYXZpZXIgb24gbWVtb3J5IHRoYW4gL2Jpbi90YXI/CgpZZXMgaXQgaXMsIHNlZSBwcmV2aW91cyBhbnN3ZXIuIFNpbmNlIEM8Q29tcHJlc3M6OlpsaWI+IGFuZCB0aGVyZWZvcmUKQzxJTzo6WmxpYj4gZG9lc24ndCBzdXBwb3J0IEM8c2Vlaz4gb24gdGhlaXIgZmlsZWhhbmRsZXMsIHRoZXJlIGlzIGxpdHRsZQpjaG9pY2UgYnV0IHRvIHJlYWQgdGhlIGFyY2hpdmUgaW50byBtZW1vcnkuClRoaXMgaXMgb2sgaWYgeW91IHdhbnQgdG8gZG8gaW4tbWVtb3J5IG1hbmlwdWxhdGlvbiBvZiB0aGUgYXJjaGl2ZS4KSWYgeW91IGp1c3Qgd2FudCB0byBleHRyYWN0LCB1c2UgdGhlIEM8ZXh0cmFjdF9hcmNoaXZlPiBjbGFzcyBtZXRob2QKaW5zdGVhZC4gSXQgd2lsbCBvcHRpbWl6ZSBhbmQgd3JpdGUgdG8gZGlzayBpbW1lZGlhdGVseS4KCj1pdGVtIENhbid0IHlvdSBsYXp5LWxvYWQgZGF0YSBpbnN0ZWFkPwoKTm8sIG5vdCBlYXNpbHkuIFNlZSBwcmV2aW91cyBxdWVzdGlvbi4KCj1pdGVtIEhvdyBtdWNoIG1lbW9yeSB3aWxsIGFuIFgga2IgdGFyIGZpbGUgbmVlZD8KClByb2JhYmx5IG1vcmUgdGhhbiBYIGtiLCBzaW5jZSBpdCB3aWxsIGFsbCBiZSByZWFkIGludG8gbWVtb3J5LiBJZgp0aGlzIGlzIGEgcHJvYmxlbSwgYW5kIHlvdSBkb24ndCBuZWVkIHRvIGRvIGluIG1lbW9yeSBtYW5pcHVsYXRpb24Kb2YgdGhlIGFyY2hpdmUsIGNvbnNpZGVyIHVzaW5nIEM8L2Jpbi90YXI+IGluc3RlYWQuCgo9aXRlbSBXaGF0IGRvIHlvdSBkbyB3aXRoIHVuc3VwcG9ydGVkIGZpbGV0eXBlcyBpbiBhbiBhcmNoaXZlPwoKQzxVbml4PiBoYXMgYSBmZXcgZmlsZXR5cGVzIHRoYXQgYXJlbid0IHN1cHBvcnRlZCBvbiBvdGhlciBwbGF0Zm9ybXMsCmxpa2UgQzxXaW4zMj4uIElmIHdlIGVuY291bnRlciBhIEM8aGFyZGxpbms+IG9yIEM8c3ltbGluaz4gd2UnbGwganVzdAp0cnkgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGZpbGUsIHJhdGhlciB0aGFuIHRocm93aW5nIGFuIGVycm9yLgoKVGhpcyBkb2VzIHJlcXVpcmUgeW91IHRvIHJlYWQgdGhlIGVudGlyZSBhcmNoaXZlIGluIHRvIG1lbW9yeSBmaXJzdCwKc2luY2Ugb3RoZXJ3aXNlIHdlIHdvdWxkbid0IGtub3cgd2hhdCBkYXRhIHRvIGZpbGwgdGhlIGNvcHkgd2l0aC4KKFRoaXMgbWVhbnMgdGhhdCB5b3UgY2Fubm90IHVzZSB0aGUgY2xhc3MgbWV0aG9kcyBvbiBhcmNoaXZlcyB0aGF0CmhhdmUgaW5jb21wYXRpYmxlIGZpbGV0eXBlcyBhbmQgc3RpbGwgZXhwZWN0IHRoaW5ncyB0byB3b3JrKS4KCkZvciBvdGhlciBmaWxldHlwZXMsIGxpa2UgQzxjaGFyZGV2cz4gYW5kIEM8YmxvY2tkZXZzPiB3ZSdsbCB3YXJuIHRoYXQKdGhlIGV4dHJhY3Rpb24gb2YgdGhpcyBwYXJ0aWN1bGFyIGl0ZW0gZGlkbid0IHdvcmsuCgo9aXRlbSBJJ20gdXNpbmcgV2luWmlwLCBvciBzb21lIG90aGVyIG5vbi1QT1NJWCBjbGllbnQsIGFuZCBmaWxlcyBhcmUgbm90IGJlaW5nIGV4dHJhY3RlZCBwcm9wZXJseSEKCkJ5IGRlZmF1bHQsIEM8QXJjaGl2ZTo6VGFyPiBpcyBpbiBhIGNvbXBsZXRlbHkgUE9TSVgtY29tcGF0aWJsZQptb2RlLCB3aGljaCB1c2VzIHRoZSBQT1NJWC1zcGVjaWZpY2F0aW9uIG9mIEM8dGFyPiB0byBzdG9yZSBmaWxlcy4KRm9yIHBhdGhzIGdyZWF0aGVyIHRoYW4gMTAwIGNoYXJhY3RlcnMsIHRoaXMgaXMgZG9uZSB1c2luZyB0aGUKQzxQT1NJWCBoZWFkZXIgcHJlZml4Pi4gTm9uLVBPU0lYLWNvbXBhdGlibGUgY2xpZW50cyBtYXkgbm90IHN1cHBvcnQKdGhpcyBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uLCBhbmQgbWF5IG9ubHkgc3VwcG9ydCB0aGUgQzxHTlUgRXh0ZW5kZWQKSGVhZGVyPiBmdW5jdGlvbmFsaXR5LiBUbyBmYWNpbGl0YXRlIHRob3NlIGNsaWVudHMsIHlvdSBjYW4gc2V0IHRoZQpDPCRBcmNoaXZlOjpUYXI6OkRPX05PVF9VU0VfUFJFRklYPiB2YXJpYWJsZSB0byBDPHRydWU+LiBTZWUgdGhlIApDPEdMT0JBTCBWQVJJQUJMRVM+IHNlY3Rpb24gZm9yIGRldGFpbHMgb24gdGhpcyB2YXJpYWJsZS4KCk5vdGUgdGhhdCBHTlUgdGFyIGVhcmxpZXIgdGhhbiB2ZXJzaW9uIDEuMTQgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGgKdGhlIEM8UE9TSVggaGVhZGVyIHByZWZpeD4uIElmIHlvdSB1c2Ugc3VjaCBhIHZlcnNpb24sIGNvbnNpZGVyIHNldHRpbmcKdGhlIEM8JEFyY2hpdmU6OlRhcjo6RE9fTk9UX1VTRV9QUkVGSVg+IHZhcmlhYmxlIHRvIEM8dHJ1ZT4uCgo9aXRlbSBIb3cgZG8gSSBleHRyYWN0IG9ubHkgZmlsZXMgdGhhdCBoYXZlIHByb3BlcnR5IFggZnJvbSBhbiBhcmNoaXZlPwoKU29tZXRpbWVzLCB5b3UgbWlnaHQgbm90IHdpc2ggdG8gZXh0cmFjdCBhIGNvbXBsZXRlIGFyY2hpdmUsIGp1c3QKdGhlIGZpbGVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHlvdSwgYmFzZWQgb24gc29tZSBjcml0ZXJpYS4KCllvdSBjYW4gZG8gdGhpcyBieSBmaWx0ZXJpbmcgYSBsaXN0IG9mIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3RzCmJhc2VkIG9uIHlvdXIgY3JpdGVyaWEuIEZvciBleGFtcGxlLCB0byBleHRyYWN0IG9ubHkgZmlsZXMgdGhhdCBoYXZlCnRoZSBzdHJpbmcgQzxmb28+IGluIHRoZWlyIHRpdGxlLCB5b3Ugd291bGQgdXNlOgoKICAgICR0YXItPmV4dHJhY3QoIAogICAgICAgIGdyZXAgeyAkXy0+ZnVsbF9wYXRoID1+IC9mb28vIH0gJHRhci0+Z2V0X2ZpbGVzCiAgICApOyAKClRoaXMgd2F5LCB5b3UgY2FuIGZpbHRlciBvbiBhbnkgYXR0cmlidXRlIG9mIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZS4KQ29uc3VsdCB0aGUgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IGRvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGVzZQpvYmplY3RzLgoKPWl0ZW0gSG93IGRvIEkgYWNjZXNzIC50YXIuWiBmaWxlcz8KClRoZSBDPEFyY2hpdmU6OlRhcj4gbW9kdWxlIGNhbiBvcHRpb25hbGx5IHVzZSBDPENvbXByZXNzOjpabGliPiAodmlhCnRoZSBDPElPOjpabGliPiBtb2R1bGUpIHRvIGFjY2VzcyB0YXIgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZAp3aXRoIEM8Z3ppcD4uIFVuZm9ydHVuYXRlbHkgdGFyIGZpbGVzIGNvbXByZXNzZWQgd2l0aCB0aGUgVW5peCBDPGNvbXByZXNzPgp1dGlsaXR5IGNhbm5vdCBiZSByZWFkIGJ5IEM8Q29tcHJlc3M6OlpsaWI+IGFuZCBzbyBjYW5ub3QgYmUgZGlyZWN0bHkKYWNjZXNzZXMgYnkgQzxBcmNoaXZlOjpUYXI+LgoKSWYgdGhlIEM8dW5jb21wcmVzcz4gb3IgQzxndW56aXA+IHByb2dyYW1zIGFyZSBhdmFpbGFibGUsIHlvdSBjYW4gdXNlCm9uZSBvZiB0aGVzZSB3b3JrYXJvdW5kcyB0byByZWFkIEM8LnRhci5aPiBmaWxlcyBmcm9tIEM8QXJjaGl2ZTo6VGFyPgoKRmlyc3RseSB3aXRoIEM8dW5jb21wcmVzcz4KCiAgICB1c2UgQXJjaGl2ZTo6VGFyOwoKICAgIG9wZW4gRiwgInVuY29tcHJlc3MgLWMgJGZpbGVuYW1lIHwiOwogICAgbXkgJHRhciA9IEFyY2hpdmU6OlRhci0+bmV3KCpGKTsKICAgIC4uLgoKYW5kIHRoaXMgd2l0aCBDPGd1bnppcD4KCiAgICB1c2UgQXJjaGl2ZTo6VGFyOwoKICAgIG9wZW4gRiwgImd1bnppcCAtYyAkZmlsZW5hbWUgfCI7CiAgICBteSAkdGFyID0gQXJjaGl2ZTo6VGFyLT5uZXcoKkYpOwogICAgLi4uCgpTaW1pbGFybHksIGlmIHRoZSBDPGNvbXByZXNzPiBwcm9ncmFtIGlzIGF2YWlsYWJsZSwgeW91IGNhbiB1c2UgdGhpcyB0bwp3cml0ZSBhIEM8LnRhci5aPiBmaWxlCgogICAgdXNlIEFyY2hpdmU6OlRhcjsKICAgIHVzZSBJTzo6RmlsZTsKCiAgICBteSAkZmggPSBuZXcgSU86OkZpbGUgInwgY29tcHJlc3MgLWMgPiRmaWxlbmFtZSI7CiAgICBteSAkdGFyID0gQXJjaGl2ZTo6VGFyLT5uZXcoKTsKICAgIC4uLgogICAgJHRhci0+d3JpdGUoJGZoKTsKICAgICRmaC0+Y2xvc2UgOwoKPWl0ZW0gSG93IGRvIEkgaGFuZGxlIFVuaWNvZGUgc3RyaW5ncz8KCkM8QXJjaGl2ZTo6VGFyPiB1c2VzIGJ5dGUgc2VtYW50aWNzIGZvciBhbnkgZmlsZXMgaXQgcmVhZHMgZnJvbSBvciB3cml0ZXMKdG8gZGlzay4gVGhpcyBpcyBub3QgYSBwcm9ibGVtIGlmIHlvdSBvbmx5IGRlYWwgd2l0aCBmaWxlcyBhbmQgbmV2ZXIKbG9vayBhdCB0aGVpciBjb250ZW50IG9yIHdvcmsgc29sZWx5IHdpdGggYnl0ZSBzdHJpbmdzLiBCdXQgaWYgeW91IHVzZQpVbmljb2RlIHN0cmluZ3Mgd2l0aCBjaGFyYWN0ZXIgc2VtYW50aWNzLCBzb21lIGFkZGl0aW9uYWwgc3RlcHMgbmVlZAp0byBiZSB0YWtlbi4KCkZvciBleGFtcGxlLCBpZiB5b3UgYWRkIGEgVW5pY29kZSBzdHJpbmcgbGlrZQoKICAgICMgUHJvYmxlbQogICAgJHRhci0+YWRkX2RhdGEoJ2ZpbGUudHh0JywgIkV1cm86IFx4ezIwQUN9Iik7Cgp0aGVuIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIGxhdGVyIHdoZW4gdGhlIHRhcmZpbGUgZ2V0cyB3cml0dGVuIG91dAp0byBkaXNrIHZpYSBDPCR0YXItPndyaXRlKCk+OgoKICAgIFdpZGUgY2hhcmFjdGVyIGluIHByaW50IGF0IC4uLi9BcmNoaXZlL1Rhci5wbSBsaW5lIDEwMTQuCgpUaGUgZGF0YSB3YXMgYWRkZWQgYXMgYSBVbmljb2RlIHN0cmluZyBhbmQgd2hlbiB3cml0aW5nIGl0IG91dCB0byBkaXNrLAp0aGUgQzw6dXRmOD4gbGluZSBkaXNjaXBsaW5lIHdhc24ndCBzZXQgYnkgQzxBcmNoaXZlOjpUYXI+LCBzbyBQZXJsCnRyaWVkIHRvIGNvbnZlcnQgdGhlIHN0cmluZyB0byBJU08tODg1OSBhbmQgZmFpbGVkLiBUaGUgd3JpdHRlbiBmaWxlCm5vdyBjb250YWlucyBnYXJiYWdlLgoKRm9yIHRoaXMgcmVhc29uLCBVbmljb2RlIHN0cmluZ3MgbmVlZCB0byBiZSBjb252ZXJ0ZWQgdG8gVVRGLTgtZW5jb2RlZApieXRlc3RyaW5ncyBiZWZvcmUgdGhleSBhcmUgaGFuZGVkIG9mZiB0byBDPGFkZF9kYXRhKCk+OgoKICAgIHVzZSBFbmNvZGU7CiAgICBteSAkZGF0YSA9ICJBY2NlbnRlZCBjaGFyYWN0ZXI6IFx4ezIwQUN9IjsKICAgICRkYXRhID0gZW5jb2RlKCd1dGY4JywgJGRhdGEpOwoKICAgICR0YXItPmFkZF9kYXRhKCdmaWxlLnR4dCcsICRkYXRhKTsKCkEgb3Bwb3NpdGUgcHJvYmxlbSBvY2N1cnMgaWYgeW91IGV4dHJhY3QgYSBVVEY4LWVuY29kZWQgZmlsZSBmcm9tIGEgCnRhcmJhbGwuIFVzaW5nIEM8Z2V0X2NvbnRlbnQoKT4gb24gdGhlIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3QKd2lsbCByZXR1cm4gaXRzIGNvbnRlbnQgYXMgYSBieXRlc3RyaW5nLCBub3QgYXMgYSBVbmljb2RlIHN0cmluZy4KCklmIHlvdSB3YW50IGl0IHRvIGJlIGEgVW5pY29kZSBzdHJpbmcgKGJlY2F1c2UgeW91IHdhbnQgY2hhcmFjdGVyCnNlbWFudGljcyB3aXRoIG9wZXJhdGlvbnMgbGlrZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcpLCB5b3UgbmVlZAp0byBkZWNvZGUgdGhlIFVURjgtZW5jb2RlZCBjb250ZW50IGFuZCBoYXZlIFBlcmwgY29udmVydCBpdCBpbnRvIAphIFVuaWNvZGUgc3RyaW5nOgoKICAgIHVzZSBFbmNvZGU7CiAgICBteSAkZGF0YSA9ICR0YXItPmdldF9jb250ZW50KCk7CiAgICAKICAgICMgTWFrZSBpdCBhIFVuaWNvZGUgc3RyaW5nCiAgICAkZGF0YSA9IGRlY29kZSgndXRmOCcsICRkYXRhKTsKClRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IGluIEM8QXJjaGl2ZTo6VGFyPiwgCmJlY2F1c2UgYSB0YXJiYWxsIGNhbiBjb250YWluIG1hbnkgZmlsZXMsIGFuZCBlYWNoIG9mIHdoaWNoIGNvdWxkIGJlCmVuY29kZWQgaW4gYSBkaWZmZXJlbnQgd2F5LgoKPWJhY2sKCj1oZWFkMSBUT0RPCgo9b3ZlciA0Cgo9aXRlbSBDaGVjayBpZiBwYXNzZWQgaW4gaGFuZGxlcyBhcmUgb3BlbiBmb3IgcmVhZC93cml0ZQoKQ3VycmVudGx5IEkgZG9uJ3Qga25vdyBvZiBhbnkgcG9ydGFibGUgcHVyZSBwZXJsIHdheSB0byBkbyB0aGlzLgpTdWdnZXN0aW9ucyB3ZWxjb21lLgoKPWl0ZW0gQWxsb3cgYXJjaGl2ZXMgdG8gYmUgcGFzc2VkIGluIGFzIHN0cmluZwoKQ3VycmVudGx5LCB3ZSBvbmx5IGFsbG93IG9wZW5lZCBmaWxlaGFuZGxlcyBvciBmaWxlbmFtZXMsIGJ1dApub3Qgc3RyaW5ncy4gVGhlIGludGVybmFscyB3b3VsZCBuZWVkIHNvbWUgcmV3b3JraW5nIHRvIGZhY2lsaXRhdGUKc3RyaW5naWZpZWQgYXJjaGl2ZXMuCgo9aXRlbSBGYWNpbGl0YXRlIHByb2Nlc3NpbmcgYW4gb3BlbmVkIGZpbGVoYW5kbGUgb2YgYSBjb21wcmVzc2VkIGFyY2hpdmUKCkN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHRoaXMgaWYgdGhlIGZpbGVoYW5kbGUgaXMgYW4gSU86OlpsaWIgb2JqZWN0LgpFbnZpcm9ubWVudHMsIGxpa2UgYXBhY2hlLCB3aWxsIHByZXNlbnQgeW91IHdpdGggYW4gb3BlbmVkIGZpbGVoYW5kbGUKdG8gYW4gdXBsb2FkZWQgZmlsZSwgd2hpY2ggbWlnaHQgYmUgYSBjb21wcmVzc2VkIGFyY2hpdmUuCgo9YmFjawoKPWhlYWQxIFNFRSBBTFNPCgo9b3ZlciA0Cgo9aXRlbSBUaGUgR05VIHRhciBzcGVjaWZpY2F0aW9uCgpDPGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90YXIvbWFudWFsL3Rhci5odG1sPgoKPWl0ZW0gVGhlIFBBWCBmb3JtYXQgc3BlY2ljYXRpb24KClRoZSBzcGVjaWZjYXRpb24gd2hpY2ggdGFyIGRlcml2ZXMgZnJvbTsgQzwgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9wYXguaHRtbD4KCj1pdGVtIEEgY29tcGFyaXNvbiBvZiBHTlUgYW5kIFBPU0lYIHRhciBzdGFuZGFyZHM7IEM8aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy90YXIvdGFyXzExNC5odG1sPgoKPWl0ZW0gR05VIHRhciBpbnRlbmRzIHRvIHN3aXRjaCB0byBQT1NJWCBjb21wYXRpYmlsaXR5CgpHTlUgVGFyIGF1dGhvcnMgaGF2ZSBleHByZXNzZWQgdGhlaXIgaW50ZW50aW9uIHRvIGJlY29tZSBjb21wbGV0ZWx5ClBPU0lYLWNvbXBhdGlibGU7IEM8aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3Rhci9tYW51YWwvaHRtbF9ub2RlL0Zvcm1hdHMuaHRtbD4KCj1pdGVtIEEgQ29tcGFyaXNvbiBiZXR3ZWVuIHZhcmlvdXMgdGFyIGltcGxlbWVudGF0aW9ucwoKTGlzdHMga25vd24gaXNzdWVzIGFuZCBpbmNvbXBhdGliaWxpdGllczsgQzxodHRwOi8vZ2QudHV3aWVuLmFjLmF0L3V0aWxzL2FyY2hpdmVycy9zdGFyL1JFQURNRS5vdGhlcmJ1Z3M+Cgo9YmFjawoKPWhlYWQxIEFVVEhPUgoKVGhpcyBtb2R1bGUgYnkgSm9zIEJvdW1hbnMgRTxsdD5rYW5lQGNwYW4ub3JnRTxndD4uCgpQbGVhc2UgcmVwb3J0cyBidWdzIHRvIEU8bHQ+YnVnLWFyY2hpdmUtdGFyQHJ0LmNwYW4ub3JnRTxndD4uCgo9aGVhZDEgQUNLTk9XTEVER0VNRU5UUwoKVGhhbmtzIHRvIFNlYW4gQnVya2UsIENocmlzIE5hbmRvciwgQ2hpcCBTYWx6ZW5iZXJnLCBUaW0gSGVhbmV5IGFuZAplc3BlY2lhbGx5IEFuZHJldyBTYXZpZ2UgZm9yIHRoZWlyIGhlbHAgYW5kIHN1Z2dlc3Rpb25zLgoKPWhlYWQxIENPUFlSSUdIVAoKVGhpcyBtb2R1bGUgaXMgY29weXJpZ2h0IChjKSAyMDAyIC0gMjAwNyBKb3MgQm91bWFucyAKRTxsdD5rYW5lQGNwYW4ub3JnRTxndD4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSAKaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9Y3V0Cg==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCi8qKgogKiBAcGFja2FnZSAgICAgU3VwcG9ydAogKiBAc2VjdGlvbiAgICAgR2VuZXJhbAogKi8KCi5BZG1pblN1cHBvcnQgLkNoZWNrUmVzdWx0IHsKICAgIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgI2FhYTsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCi5BZG1pblN1cHBvcnQgLkNoZWNrUmVzdWx0ID4gcCB7CiAgICBwYWRkaW5nOiAwIDAgMXB4IDM1cHg7Cn0KCi5BZG1pblN1cHBvcnQgLkNoZWNrUmVzdWx0T0sgPiBwIHsKICAgIGNvbG9yOiAjODg4Owp9CgouQWRtaW5TdXBwb3J0IC5DaGVja1Jlc3VsdE9LOmhvdmVyID4gcCB7CiAgICBjb2xvcjogIzAwMDsKfQovKioKICogQHN1YnNlY3Rpb24gIEZsYWcKICovCi5BZG1pblN1cHBvcnQgLkZsYWcgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltZy9mbGFnX3NoYWRvdy5wbmcpIG5vLXJlcGVhdCBzY3JvbGwgMCAwOwogICAgaGVpZ2h0OiAxOHB4OwogICAgd2lkdGg6IDI0cHg7CiAgICBmbG9hdDogbGVmdDsKICAgIG1hcmdpbjogMnB4IDEwcHggMCAwOwp9CgouQWRtaW5TdXBwb3J0IC5GbGFnLlNtYWxsIHsKICAgIHdpZHRoOiAxN3B4OwogICAgaGVpZ2h0OiAxMHB4OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogYm90dG9tIHJpZ2h0Owp9CgouQWRtaW5TdXBwb3J0IC5GbGFnIHNwYW4gewogICAgZGlzcGxheTogYmxvY2s7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIHRleHQtaW5kZW50OiAtOTk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgLyogc2V0IGEgZGVmYXVsdCBjb2xvciBmb3IgcHJpb3JpdGllcyAqLwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NkY2RjZDsKfQoKLkFkbWluU3VwcG9ydCAuRmxhZy5TbWFsbCBzcGFuIHsKICAgIGhlaWdodDogOHB4Owp9CgouQWRtaW5TdXBwb3J0IC5DaGVja1Jlc3VsdE9LIC5GbGFnIHNwYW4gewogICAgYmFja2dyb3VuZC1jb2xvcjogIzAwODAwMDsKfQoKLkFkbWluU3VwcG9ydCAuQ2hlY2tSZXN1bHRGYWlsZWQgLkZsYWcgc3BhbiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYwMDAwOwp9CgouQWRtaW5TdXBwb3J0IC5DaGVja1Jlc3VsdENyaXRpY2FsIC5GbGFnIHNwYW4gewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYTAwMDsKfQoKLkFkbWluU3VwcG9ydCAuQ2hlY2tSZXN1bHRDcml0aWNhbCAuRmxhZyBzcGFuIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmEwMDA7Cn0KCgp9IC8qIGVuZCBAbWVkaWEgKi8=