Support
1.2.10
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Fixed benchmark feature.
Disabled TableCheck to fix crash of the database and webserver.
Fixed bug#7491 - Support module fails on CentOS6 by upgrading bundled Linux::Distribution module to 0.20.
Fixed bugs # 5504, 6531 and 6517. Added OTRS::GeneralSystemOverview check.
Fixed invalid XML in PERL modules check result.
Fixed bug#6244 - Support module fails to run because new extra Perl module was not in the sopm file.
Internal structure improved. Added perl modules check result to the overview page.
Improved Usability, fixed distribution check on Mac OS.
Improved GUI, improved OS checks on MacOS.
Init release for OTRS 3.0.
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.0.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.
2012-08-17 13:29:48
opms.otrs.com
IyAtLQojIEFkbWluU3VwcG9ydC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU3VwcG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TdXBwb3J0LmR0bCx2IDEuMzIuMi4xIDIwMTEvMTEvMjIgMjM6Mzc6NDcgY2cgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgLS0tCiMgLSBTdXBwb3J0bW9kdWxlIG92ZXJ2aWV3IHBhZ2UKIyAtLS0KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8ZGl2IGNsYXNzPSJNYWluQm94IEFkbWluU3VwcG9ydCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDE+JFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJTdXBwb3J0IEFzc2Vzc21lbnQifTwvaDE+CgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiQWN0aW9ucyJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9J0NvbnRlbnQnPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPUNvbmZpZGVudGlhbCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPiRUZXh0eyJTdGFydCBzdXBwb3J0In08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1CZW5jaG1hcmtTUUxJbml0IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+JFRleHR7IlNRTCBiZW5jaG1hcmsifTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7Ik5vdGUifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSdDb250ZW50Jz4KICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJGb3IgcXVpY2sgaGVscCBwbGVhc2Ugc3VibWl0IHlvdXIgc3lzdGVtIGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYSBzdXBwb3J0IHRpY2tldCBhdCB0aGUgdmVuZG9yJ3Mgc2l0ZS4ifQogICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7IkZvciBtb3JlIGluZm8gcGxlYXNlIGNoZWNrIn0gPGEgaHJlZj0iaHR0cDovL290cnMuY29tLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9vdHJzLmNvbS88L2E+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlIC0tPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iVG9nZ2xlIHRoaXMgd2lkZ2V0IiBocmVmPSIjIj48L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMj4kUURhdGF7Ik1vZHVsZSJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVJvdyAtLT4KICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkNoZWNrUmVzdWx0IENoZWNrUmVzdWx0JFFEYXRheyJDaGVjayJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IiRRRGF0YXsiQ2hlY2sifSIgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRRRGF0YXsiQ2hlY2sifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRGVzY3JpcHRpb24ifQogICAgICAgICAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iU3BhY2luZ1RvcFNtYWxsIj4kUURhdGF7IkNvbW1lbnQifTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGVSb3cgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93VGV4dEFyZWEgLS0+CiAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJDaGVja1Jlc3VsdCBDaGVja1Jlc3VsdCRRRGF0YXsiQ2hlY2sifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSIkUURhdGF7IkNoZWNrIn0iIGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4kUURhdGF7IkNoZWNrIn08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkRlc2NyaXB0aW9uIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlNwYWNpbmdUb3BTbWFsbCI+JFFEYXRheyJDb21tZW50In08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJXMTAwcGMiIHJvd3M9IjciIGNvbHM9IiIgcmVhZG9ubHk9InJlYWRvbmx5Ij4kUURhdGF7IkNvbnRlbnRTdHJpbmcifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVJvd1RleHRBcmVhIC0tPgoKCgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVJvd1RhYmxlRGF0YVNpbXBsZSAtLT4KICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkNoZWNrUmVzdWx0IENoZWNrUmVzdWx0JFFEYXRheyJDaGVjayJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IiRRRGF0YXsiQ2hlY2sifSIgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRRRGF0YXsiQ2hlY2sifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRGVzY3JpcHRpb24ifQogICAgICAgICAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iU3BhY2luZ1RvcFNtYWxsIj4kUURhdGF7IkNvbW1lbnQifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciI+SXRlbTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciI+VmFsdWU8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVRhYmxlUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz4kUURhdGF7Ikl0ZW1LZXkifTwvc3Ryb25nPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJWYWx1ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGVUYWJsZVJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93VGFibGVEYXRhU2ltcGxlIC0tPgoKCgoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlIC0tPgogICAgPC9kaXY+CjwvZGl2Pgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KCgojIC0tLQojIC0gU3VwcG9ydG1vZHVsZSBjb25maWRlbnRpYWwgcGFnZQojIC0tLQoKPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsIC0tPgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMT4kVGV4dHsiQWRtaW4gU3VwcG9ydCBJbmZvIn08L2gxPgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiQWN0aW9ucyJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIj48c3Bhbj4kVGV4dHsiR28gdG8gb3ZlcnZpZXcifTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPUJlbmNobWFya1NRTEluaXQiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIj48c3Bhbj4kVGV4dHsiU1FMIGJlbmNobWFyayJ9PC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJDb25maWRlbnRpYWwgaW5mb3JtYXRpb24ifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IENlbnRlciI+CgokSW5jbHVkZXsiQWRtaW5TdXBwb3J0TGljZW5zZVRleHQifQoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgQ2VudGVyQm94IFc1MHBjIj4KICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGNsYXNzPSJSaWdodCBTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZW5kZXJJbmZvcm1hdGlvbiIvPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWNjZXB0IGxpY2Vuc2UifSI+JFRleHR7IkFjY2VwdCBsaWNlbnNlIn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iUmlnaHQgU3BhY2luZ1RvcFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiRG9uJ3QgYWNjZXB0IGxpY2Vuc2UifSI+JFRleHR7IkRvbid0IGFjY2VwdCBsaWNlbnNlIn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbCAtLT4KCgojIC0tLQojIC0gU3VwcG9ydG1vZHVsZSBzZW5kZXIgYW5kIHN5c3RlbSBpbmZvcm1hdGlvbgojIC0tLQoKPCEtLSBkdGw6YmxvY2s6U2VuZGVySW5mb3JtYXRpb24gLS0+CjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJBZG1pbiBTdXBwb3J0IEluZm8ifTwvaDE+CiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJBY3Rpb25zIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPiRUZXh0eyJHbyB0byBvdmVydmlldyJ9PC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJWZW5kb3IgU3VwcG9ydCJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgV2l0aFBhZGRpbmciPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN1Ym1pdCIvPgo8IS0tIGR0bDpibG9jazpTZW5kZXJJbmZvcm1hdGlvbkhpZGRlbiAtLT4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiVmFsdWUifSIvPgo8IS0tIGR0bDpibG9jazpTZW5kZXJJbmZvcm1hdGlvbkhpZGRlbiAtLT4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNhbHV0YXRpb24iPiRUZXh0eyJTYWx1dGF0aW9uIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJTYWx1dGF0aW9uIiBuYW1lPSJTYWx1dGF0aW9uIiB2YWx1ZT0iJFFEYXRheyJTZW5kZXJTYWx1dGF0aW9uIn0iIGNsYXNzPSJXNTBwYyIgcmVhZG9ubHk9InJlYWRvbmx5IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmFtZSI+JFRleHR7Ik5hbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ik5hbWUiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7IlNlbmRlck5hbWUifSIgY2xhc3M9Ilc1MHBjIiByZWFkb25seT0icmVhZG9ubHkiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZW5kZXIiPiRUZXh0eyJFbWFpbCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iU2VuZGVyIiBuYW1lPSJTZW5kZXIiIHZhbHVlPSIkUURhdGF7IlNlbmRlckFkcmVzcyJ9IiBjbGFzcz0iVzUwcGMiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbXBhbnkiPiRUZXh0eyJDb21wYW55In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJDb21wYW55IiBuYW1lPSJDb21wYW55IiB2YWx1ZT0iIiBjbGFzcz0iVzUwcGMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdHJlZXQiPiRUZXh0eyJTdHJlZXQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlN0cmVldCIgbmFtZT0iU3RyZWV0IiB2YWx1ZT0iIiBjbGFzcz0iVzUwcGMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJaaXAiPiRUZXh0eyJaaXAifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlppcCIgbmFtZT0iWmlwIiB2YWx1ZT0iIiBjbGFzcz0iVzUwcGMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDaXR5Ij4kVGV4dHsiQ2l0eSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iQ2l0eSIgbmFtZT0iQ2l0eSIgdmFsdWU9IiIgY2xhc3M9Ilc1MHBjIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUGhvbmUiPiRUZXh0eyJQaG9uZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iUGhvbmUiIG5hbWU9IlBob25lIiB2YWx1ZT0iIiBjbGFzcz0iVzUwcGMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJCdWd6aWxsYUlEIj4kVGV4dHsiQnVnemlsbGEgSUQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkJ1Z3ppbGxhSUQiIG5hbWU9IkJ1Z3ppbGxhSUQiIHZhbHVlPSIiIGNsYXNzPSJXNTBwYyIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiSWYgeW91J3ZlIGFscmVhZHkgYWRkZWQgYSBCdWd6aWxsYSByZXBvcnQgYXQgYnVncy5vdHJzLm9yZywgcGxlYXNlIGFkZCB5b3VyIEJ1Z3ppbGxhIElEIGhlcmUuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPiRUZXh0eyJTZXJ2aWNlIFN1YnNjcmlwdGlvbiJ9PC9zdHJvbmc+PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJTZW5kSW5mbyIgbmFtZT0iU2VuZEluZm8iIHZhbHVlPSIxIiBjaGVja2VkPSJjaGVja2VkIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlBsZWFzZSByZWNvbW1lbmQgbWUgYSBTZXJ2aWNlIFN1YnNjcmlwdGlvbiB0byBvcHRpbWl6ZSBteSBPVFJTIn0uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIGlkPSJEb3dubG9hZCIgbmFtZT0iRG93bmxvYWQiIHZhbHVlPSIkVGV4dHsiRG93bmxvYWQifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgaWQ9IlNlbmQiIG5hbWU9IlNlbmQiIHZhbHVlPSIkVGV4dHsiU2VuZCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgogICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgICAgICAgICAkKCcjRG93bmxvYWQnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgaWYgKCQoJyNTZW5kZXInKS52YWwoKSA9PSAnJykgewogICAgICAgICAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJDYW4ndCBjcmVhdGUgc3VwcG9ydCBwYWNrYWdlLCBiZWNhdXNlIHlvdSB3b3JrIGN1cnJlbnRseSB3aXRoIHRoZSBzeXN0ZW0gdXNlciByb290QGxvY2FsaG9zdCBhbmQgeW91ciBhZG1pbiBlbWFpbCBhZGRyZXNzIGlzIG5vdCB5ZXQgY29uZmlndXJlZC4gUGxlYXNlIGRlZmluZSB0aGUgYWRtaW4gZW1haWwgc2V0dGluZyBpbiB0aGUgU3lzQ29uZmlnIG1vZHVsZSBhbmQgZG9uJ3QgdXNlIHRoZSB1c2VyIHJvb3RAbG9jYWxob3N0IGZvciB3b3JraW5nIHdpdGggT1RSUy4ifScpOwogICAgICAgICAgICAgICAgICAgICQoJyNTZW5kZXInKS5mb2N1cygpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICQoJyNTZW5kJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgIGlmICghJCgnI1NlbmRJbmZvJykuYXR0cignY2hlY2tlZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBjb25maXJtIHRoZSBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gdG8gY29udGludWUuIn0nKTsKICAgICAgICAgICAgICAgICAgICAkKCcjU2VuZEluZm8nKS5mb2N1cygpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAvL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPCEtLSBkdGw6YmxvY2s6U2VuZGVySW5mb3JtYXRpb24gLS0+CgoKIyAtLS0KIyAtIFN1cHBvcnRtb2R1bGUgYmVuY2htYXJrIHJlc3VsdAojIC0tLQoKPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0IC0tPgo8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgPGgyPiRUZXh0eyJSZXN1bHQifTogJFRleHR7IiREYXRheyJIZWFkIn0ifTwvaDI+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzIwcGMiPiRUZXh0eyJLZXkifTwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj4kVGV4dHsiVmFsdWUifTwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj4kVGV4dHsiVGltZSJ9PC90aD4KICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiQ29tbWVudCJ9PC90aD4KICAgICAgICAgICAgPC90cj4KICAgICAgICA8L3RoZWFkPgogICAgICAgIDx0Ym9keT4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93IC0tPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJLZXkifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiVmFsdWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJUaW1lIn0gcyAkUURhdGF7Ik1vb2QifQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93RmluZSAtLT4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiTG9va3MgZmluZSEifQo8IS0tIGR0bDpibG9jazpCZW5jaG1hcmtSZXN1bHRSb3dGaW5lIC0tPgo8IS0tIGR0bDpibG9jazpCZW5jaG1hcmtSZXN1bHRSb3dPSyAtLT4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiT2sifQo8IS0tIGR0bDpibG9jazpCZW5jaG1hcmtSZXN1bHRSb3dPSyAtLT4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93V3JvbmcgLS0+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7IlNob3VsZCBub3QgdGFrZSBtb3JlIHRoYW4ifSAkRGF0YXsiU2hvdWxkVGFrZSJ9J3MgJFRleHR7Im9uIGFuIGF2ZXJhZ2Ugc3lzdGVtIn0uCjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdFJvd1dyb25nIC0tPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93IC0tPgogICAgICAgIDwvdGJvZHk+CiAgICA8L3RhYmxlPgo8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0IC0tPgoKCiMgLS0tCiMgLSBTdXBwb3J0bW9kdWxlIEJlbmNobWFyayBSZXN1bHQgSW5pdCBwYWdlCiMgLS0tCgo8IS0tIGR0bDpibG9jazpCZW5jaG1hcmtSZXN1bHRJbml0IC0tPgo8ZGl2IGNsYXNzPSJNYWluQm94IEFkbWluU3VwcG9ydCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDE+JFRleHR7IkJlbmNobWFyayJ9PC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJBY3Rpb25zIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0nQ29udGVudCc+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPiRUZXh0eyJHbyB0byBvdmVydmlldyJ9PC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiTm90ZSJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9J0NvbnRlbnQnPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IlNwYWNpbmdCb3R0b20iPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGVjdXRlIGEgU1FMIGJlbmNobWFyayB0ZXN0IG9uIHlvdXIgZGF0YWJhc2UgdG8gZmluZCBvdXQgaG93IGZhc3QgeW91ciBkYXRhYmFzZSBpcyAoZG9uZSBvbiBkZWRpY2F0ZWQgYmVuY2htYXJrIHRhYmxlKS4ifQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9Ildhcm5pbmciPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJUaGlzIHNob3VsZCBub3QgYmUgZG9uZSBvbiBwcm9kdWN0aW9uIHN5c3RlbXMhIn0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiIGlkPSJTUUxCZW5jaG1hcmtXaWRnZXQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJTUUwgYmVuY2htYXJrIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iVVJMIiBuYW1lPSJVUkwiIHZhbHVlPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1CZW5jaG1hcmtTUUwiLz4KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIFRvZ2dsZSIgPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik1vZGUiPiRUZXh0eyJNdWx0aXBsaWVyIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJNb2RlU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiUGxlYXNlIHNlbGVjdCBhIG11bHRpcGxpZXIgYW5kIHByZXNzIHN0YXJ0IGJ1dHRvbi4ifTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IlNlbmRSZXF1ZXN0IiBjbGFzcz0iUHJpbWFyeSIgdmFsdWU9IiRUZXh0eyJTdGFydCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRUZXh0eyJTdGFydCJ9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBpZD0iQ29udGVudFRvVXBkYXRlIiBjbGFzcz0iV2lkZ2V0U2ltcGxlIEhpZGRlbiI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI1NlbmRSZXF1ZXN0JykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICQoJyNTUUxCZW5jaG1hcmtXaWRnZXQnKS5hZGRDbGFzcygnTG9hZGluZycpOwogICAgJCgnI1NlbmRSZXF1ZXN0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIHZhciBVUkwgPSAkKCcjVVJMJykudmFsKCkgKyAnO01vZGU9JyArICQoJyNNb2RlJykudmFsKCk7CiAgICBDb3JlLkFKQVguQ29udGVudFVwZGF0ZSgkKCcjQ29udGVudFRvVXBkYXRlJyksIFVSTCwgZnVuY3Rpb24gKCkgewogICAgICAgICQoJyNDb250ZW50VG9VcGRhdGUnKS5zaG93KCk7CiAgICAgICAgJCgnI1NRTEJlbmNobWFya1dpZGdldCcpLnJlbW92ZUNsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgJCgnI1NlbmRSZXF1ZXN0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7CiAgICB9KTsKICAgIHJldHVybiBmYWxzZTsKfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgoKPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0SW5pdCAtLT4K
IyAtLQojIEFkbWluU3VwcG9ydExpY2Vuc2VUZXh0LmR0bCAtIHByb3ZpZGVzIHRoZSBsaWNlbnNlIGRlZmluaXRpb24gZm9yIHRoZSBTdXBwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pblN1cHBvcnRMaWNlbnNlVGV4dC5kdGwsdiAxLjIgMjAxMC8wOS8xMCAwNzo0NDo0MiBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsQ29udGVudERFIC0tPgogICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkNvbmZpZGVudGlhbCIgcm93cz0iMjIiIGNvbHM9Ijc4IiByZWFkb25seT0icmVhZG9ubHkiPkRhdGVuc2NodXR6CgpXaXIsIGRpZSBGaXJtYSBPVFJTIEFHLCBuZWhtZW4gZGVuIFNjaHV0eiBJaHJlciBwZXJzJm91bWw7bmxpY2hlbiBEYXRlbiBzZWhyIGVybnN0IHVuZCBoYWx0ZW4gdW5zIHN0cmlrdCBhbiBkaWUgUmVnZWxuIGRlciBEYXRlbnNjaHV0emdlc2V0emUuIEFsbGUgUGFzc3cmb3VtbDtydGVyIHdlcmRlbiB2b3IgZGVtIFZlcnNlbmRlbiBkZXIgSW5mb3JtYXRpb25lbiBhdXRvbWF0aXNpZXJ0IHVua2VubnRsaWNoIGdlbWFjaHQuIEluIGtlaW5lbSBGYWxsIHdlcmRlbiBkaWUgZXJob2JlbmVuIERhdGVuIHZlcmthdWZ0IG9kZXIgYXVzIGFuZGVyZW4gR3ImdXVtbDtuZGVuIGFuIHVuYXV0b3Jpc2llcnRlIERyaXR0ZSB3ZWl0ZXJnZWdlYmVuLgoKRGllIG5hY2hmb2xnZW5kZSBFcmtsJmF1bWw7cnVuZyBnaWJ0IElobmVuIGVpbmVuICZVdW1sO2JlcmJsaWNrIGRhciZ1dW1sO2Jlciwgd2llIHdpciBkaWVzZW4gU2NodXR6IGdldyZhdW1sO2hybGVpc3RlbiB1bmQgd2VsY2hlIEFydCB2b24gRGF0ZW4genUgd2VsY2hlbSBad2VjayAmdXVtbDtiZXJtaXR0ZWx0IHdlcmRlbi4KCkRhdGVuJnV1bWw7YmVybWl0dGx1bmcgZHVyY2ggZGFzICdTdXBwb3J0bW9kdWwnCkRpZSBGaXJtYSBPVFJTIEFHICZ1dW1sO2Jlcm1pdHRlbHQgdW5kIHNwZWljaGVydCBJbmZvcm1hdGlvbmVuLCBkaWUgZHVyY2ggZGFzICdTdXBwb3J0bW9kdWwnIGFuIGRpZSBGaXJtYSBPVFJTIEFHIHZlcnNlbmRldCB3ZXJkZW4uIERhYmVpIGhhbmRlbHQgZXMgc2ljaCB1bSBhdXNzY2hsaWUmc3psaWc7bGljaCB1bSBEYXRlbiwgZGllIGRpZSBGaXJtYSBPVFJTIEFHIGJlbiZvdW1sO3RpZ3QsIHVtIEZ1bmt0aW9uc2YmYXVtbDtoaWdrZWl0IHVuZCBMZWlzdHVuZ3NmJmF1bWw7aGlna2VpdCBkZXMgYmV0cm9mZmVuZW4gT1RSUy1TZXJ2ZXJzIHp1IGFuYWx5c2llcmVuLCBvZGVyIHVtIGVpbmUgS29udGFrdGF1Zm5haG1lIHp1IGVybSZvdW1sO2dsaWNoZW4uCgpTaWNoZXJoZWl0IElocmVyIHBlcnMmb3VtbDtubGljaGVuIERhdGVuCkRpZSBGaXJtYSBPVFJTIEFHIHNjaCZ1dW1sO3R6dCBJaHJlIHBlcnMmb3VtbDtubGljaGVuIERhdGVuIHZvciB1bmVybGF1YnRlbiBadWdyaWZmLCBWZXJ3ZW5kdW5nIG9kZXIgVmVyJm91bWw7ZmZlbnRsaWNodW5nLiBEaWUgRmlybWEgT1RSUyBBRyBzb3JndCBkYWYmdXVtbDtyLCBkYXNzIHZvbiBJaG5lbiBhdWYgZGVtIFNlcnZlciBnZXNwZWljaGVydGUgcGVycyZvdW1sO25saWNoZSBJbmZvcm1hdGlvbmVuIGluIGVpbmVyIGtvbnRyb2xsaWVydGVuLCBzaWNoZXJlbiBVbWdlYnVuZyB2b3IgdW5lcmxhdWJ0ZW0gWnVncmlmZiB1bmQgVmVyJm91bWw7ZmZlbnRsaWNodW5nIGdlc2NoJlV1bWw7dHp0IHNpbmQuCgpXZWl0ZXJnYWJlIElocmVyIERhdGVuCkRpZSBGaXJtYSBPVFJTIEFHIGdpYnQgSWhyZSBEYXRlbiBuaWNodCBhbiBEcml0dGUgd2VpdGVyLCBzb2Zlcm4gZGllcyBuaWNodCB6dXIgQWJ3aWNrbHVuZyBkZXMgR2VzY2gmYXVtbDtmdHN2ZXJrZWhyZXMgbiZvdW1sO3RpZyBpc3QuClNvd2VpdCBkaWUgRmlybWEgT1RSUyBBRyBnZXNldHpsaWNoIG9kZXIgcGVyIEdlcmljaHRzYmVzY2hsdXNzIGRhenUgdmVycGZsaWNodGV0IGlzdCwgZ2ViZW4gd2lyIElocmUgRGF0ZW4gbnVyIGFuIGF1c2t1bmZ0c2JlcmVjaHRpZ3RlIHN0YWF0bGljaGUgSW5zdGl0dXRpb25lbiB1bmQgQmVoJm91bWw7cmRlbiB3ZWl0ZXIuCgomQXVtbDtuZGVydW5nIGRpZXNlciBEYXRlbnNjaHV0emJlc3RpbW11bmdlbgpEaWUgRmlybWEgT1RSUyBBRyBiZWgmYXVtbDtsdCBzaWNoIGRhcyBSZWNodCB2b3IsIGRpZXNlIFNpY2hlcmhlaXRzLSB1bmQgRGF0ZW5zY2h1dHptYSZzemxpZztuYWhtZW4genUgdmVyJmF1bWw7bmRlcm4sIHNvd2VpdCBkaWVzIHdlZ2VuIGRlciB0ZWNobmlzY2hlbiBFbnR3aWNrbHVuZyBlcmZvcmRlcmxpY2ggd2lyZC4gSW4gc29sY2hlbiBGJmF1bWw7bGxlbiB3ZXJkZW4gd2lyIGF1Y2ggdW5zZXJlIEhpbndlaXNlIHp1bSBEYXRlbnNjaHV0eiBlbnRzcHJlY2hlbmQgYW5wYXNzZW4uIEJpdHRlIGJlYWNodGVuIFNpZSBkYWhlciBkaWUgamV3ZWlscyBha3R1ZWxsZSBWZXJzaW9uIHVuc2VyZXIgRGF0ZW5zY2h1dHplcmtsJmF1bWw7cnVuZy4KCkF1c2t1bmZ0c3JlY2h0ClNpZSBoYWJlbiBqZWRlcnplaXQgZGFzIFJlY2h0IGF1ZiBBdXNrdW5mdCAmdXVtbDtiZXIgZGllIGJleiZ1dW1sO2dsaWNoIElocmVyIFBlcnNvbiBnZXNwZWljaGVydGVuIERhdGVuLCBkZXJlbiBIZXJrdW5mdCB1bmQgRW1wZiZhdW1sO25nZXIgc293aWUgZGVuIFp3ZWNrIGRlciBEYXRlbnZlcmFyYmVpdHVuZy4gQXVza3VuZnQgJnV1bWw7YmVyIGRpZSBnZXNwZWljaGVydGVuIERhdGVuIGsmb3VtbDtubmVuIFNpZSB1bnRlciBpbmZvQG90cnMuY29tIGFuZm9yZGVybi4KCldlaXRlcmUgSW5mb3JtYXRpb25lbgpJaHIgVmVydHJhdWVuIGlzdCB1bnMgd2ljaHRpZy4gRGFoZXIgZ2ViZW4gd2lyIElobmVuIGdlcm5lIGplZGVyemVpdCBBdXNrdW5mdCAmdXVtbDtiZXIgZGllIFZlcmFyYmVpdHVuZyBJaHJlciBwZXJzb25lbmJlem9nZW5lbiBEYXRlbi4gV2VubiBTaWUgRnJhZ2VuIGhhYmVuLCBkaWUgSWhuZW4gZGllc2UgRGF0ZW5zY2h1dHplcmtsJmF1bWw7cnVuZyBuaWNodCBiZWFudHdvcnRlbiBrb25udGUgb2RlciB3ZW5uIFNpZSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZWluZW0gUHVua3QgdyZ1dW1sO25zY2hlbiwgd2VuZGVuIFNpZSBzaWNoIGJpdHRlIG1pdCBlaW5lciBFLU1haWwgYW4gaW5mb0BvdHJzLmNvbS4KICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbENvbnRlbnRERSAtLT4KPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsQ29udGVudEVOIC0tPgogICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkNvbmZpZGVudGlhbCIgcm93cz0iMjIiIGNvbHM9Ijc4IiByZWFkb25seT0icmVhZG9ubHkiPkRhdGEgUHJvdGVjdGlvbgoKSGVyZSBhdCBPVFJTIEFHIHdlIHRha2UgdGhlIHByb3RlY3Rpb24gb2YgeW91ciBwZXJzb25hbCBkZXRhaWxzIHZlcnkgc2VyaW91c2x5IGFuZCBzdHJpY3RseSBhZGhlcmUgdG8gZGF0YSBwcm90ZWN0aW9uIGxhd3MuIEFsbCBwYXNzd29yZHMgYXJlIGF1dG9tYXRpY2FsbHkgbWFkZSB1bnJlY29nbml6YWJsZSBiZWZvcmUgdGhlIGluZm9ybWF0aW9uIGlzIHNlbnQuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCBhbnkgZGF0YSB3ZSBvYnRhaW4gYmUgc29sZCBvciBwYXNzZWQgb24gdG8gdW5hdXRob3JpemVkIHRoaXJkIHBhcnRpZXMuClRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb24gcHJvdmlkZXMgeW91IHdpdGggYW4gb3ZlcnZpZXcgb2YgaG93IHdlIGd1YXJhbnRlZSB0aGlzIHByb3RlY3Rpb24gYW5kIHdoaWNoIHR5cGUgb2YgZGF0YSBpcyBjb2xsZWN0ZWQgZm9yIHdoaWNoIHB1cnBvc2UuCgpEYXRhIEhhbmRsaW5nIHdpdGggJ1N1cHBvcnQgTW9kdWxlJwpJbmZvcm1hdGlvbiByZWNlaXZlZCB0aHJvdWdoIHRoZSAnU3VwcG9ydCBNb2R1bGUnIGlzIHNhdmVkIGJ5IE9UUlMgQUcuIFRoaXMgb25seSBhcHBsaWVzIHRvIGRhdGEgdGhhdCBPVFJTIEFHIHJlcXVpcmVzIHRvIGFuYWx5emUgdGhlIHBlcmZvcm1hbmNlIGFuZCBmdW5jdGlvbiBvZiB0aGUgT1RSUyBzZXJ2ZXIgb3IgdG8gZXN0YWJsaXNoIGNvbnRhY3QuCgpTYWZldHkgb2YgUGVyc29uYWwgRGV0YWlscwpPVFJTIEFHIHByb3RlY3RzIHlvdXIgcGVyc29uYWwgZGF0YSBmcm9tIHVuYXV0aG9yaXplZCBhY2Nlc3MsIHVzZSBvciBwdWJsaWNhdGlvbi4gT1RSUyBBRyBlbnN1cmVzIHRoYXQgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHlvdSBzdG9yZSBvbiB0aGUgc2VydmVyIGlzIHByb3RlY3RlZCBmcm9tIHVuYXV0aG9yaXplZCBhY2Nlc3MgYW5kIHB1YmxpY2F0aW9uLgoKRGlzY2xvc3VyZSBvZiBEZXRhaWxzCk9UUlMgQUcgd2lsbCBub3QgcGFzcyBvbiB5b3VyIGRldGFpbHMgdG8gdGhpcmQgcGFydGllcyB1bmxlc3MgcmVxdWlyZWQgZm9yIGJ1c2luZXNzIHRyYW5zYWN0aW9ucy4KT1RSUyBBRyB3aWxsIG9ubHkgcGFzcyBvbiB5b3VyIGRldGFpbHMgdG8gZW50aXRsZWQgcHVibGljIGluc3RpdHV0aW9ucyBhbmQgYXV0aG9yaXRpZXMgaWYgcmVxdWlyZWQgYnkgbGF3IG9yIGNvdXJ0IG9yZGVyLgoKQW1lbmRtZW50IG9mIERhdGEgUHJvdGVjdGlvbiBQb2xpY3kKT1RSUyBBRyByZXNlcnZlcyB0aGUgcmlnaHQgdG8gYW1lbmQgdGhpcyBzZWN1cml0eSBhbmQgZGF0YSBwcm90ZWN0aW9uIHBvbGljeSBpZiByZXF1aXJlZCBieSB0ZWNobmljYWwgZGV2ZWxvcG1lbnRzLiBJbiB0aGlzIGNhc2Ugd2Ugd2lsbCBhbHNvIGFkYXB0IG91ciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgZGF0YSBwcm90ZWN0aW9uIGFjY29yZGluZ2x5LiBQbGVhc2UgcmVndWxhcmx5IHJlZmVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBvdXIgRGF0YSBQcm90ZWN0aW9uIFBvbGljeS4KClJpZ2h0IHRvIEluZm9ybWF0aW9uCllvdSBoYXZlIHRoZSByaWdodCB0byBkZW1hbmQgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgZGF0YSBzYXZlZCBhYm91dCB5b3UsIGl0cyBvcmlnaW4gYW5kIHJlY2lwaWVudHMsIGFzIHdlbGwgYXMgdGhlIHB1cnBvc2Ugb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyBhdCBhbnkgdGltZS4gWW91IGNhbiByZXF1ZXN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYXZlZCBkYXRhIGJ5IHNlbmRpbmcgYW4gZS1tYWlsIHRvIGluZm9Ab3Rycy5jb20uCgpGdXJ0aGVyIEluZm9ybWF0aW9uCllvdXIgdHJ1c3QgaXMgdmVyeSBpbXBvcnRhbnQgdG8gdXMuIFdlIGFyZSB3aWxsaW5nIHRvIGluZm9ybSB5b3UgYWJvdXQgdGhlIHByb2Nlc3Npbmcgb2YgeW91ciBwZXJzb25hbCBkZXRhaWxzIGF0IGFueSB0aW1lLiBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiBhbnN3ZXJlZCBieSB0aGlzIERhdGEgUHJvdGVjdGlvbiBQb2xpY3kgb3IgaWYgeW91IHJlcXVpcmUgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHRvcGljLCBwbGVhc2UgY29udGFjdCBpbmZvQG90cnMuY29tLgoKICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbENvbnRlbnRFTiAtLT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMiBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN1cHBvcnQucG0sdiAxLjQ4LjIuMyAyMDEyLzA4LzE3IDExOjI5OjMzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQYWNrYWdlOwp1c2UgRGlnZXN0OjpNRDUgcXcobWQ1X2hleCk7Cgp1c2UgTUlNRTo6QmFzZTY0Owp1c2UgQXJjaGl2ZTo6VGFyOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQ4LjIuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQgLSBnbG9iYWwgc3lzdGVtIGluZm9ybWF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCByZXF1aXJlZCBzdXBwb3J0IGluZm9ybWF0aW9uIG9mIGEgcnVubmluZyBPVFJTIHN5c3RlbS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIFN1cHBvcnQgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkU3VwcG9ydE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntEQk9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntYTUxPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntFbWFpbE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntQYWNrYWdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpQYWNrYWdlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpnZXQgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHBvc3NpYmlsaXR5IGNoZWNrcy4KCiAgICBteSAkTGlzdCA9ICRTdXBwb3J0LT5BZG1pbkNoZWNrc0dldCgpOwoKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0FkbWluQ2hlY2tzR2V0IHN0YXJ0JywKICAgICk7CgogICAgIyBnZXQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9TeXN0ZW0vU3VwcG9ydC8nOwoKICAgICMgcmVhZCBhbGwgYXZhaWxpYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYiggJERpck5hbWUgLiAnLyoucG0nICk7CgogICAgbXkgJERhdGFIYXNoOwogICAgTU9EVUxFOgogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OiRGaWxlIjsKCiAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKCiAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgbG9hZCAkR2VuZXJpY01vZHVsZSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBNT0RVTEU7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBuZXcgb2JqZWN0CiAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCAleyRTZWxmfSApOwoKICAgICAgICAjIHJldHVybiBpZiBpbnN0YW5jZSBjYW4gbm90IGJlIGNyZWF0ZWQKICAgICAgICBpZiAoICEkU3VwcG9ydE9iamVjdCApIHsKCiAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mICRHZW5lcmljTW9kdWxlISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IE1PRFVMRTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFkbWluIGNoZWNrIGRhdGEKICAgICAgICBteSAkQWRtaW5DaGVja1JlZiA9ICRTdXBwb3J0T2JqZWN0LT5BZG1pbkNoZWNrc0dldCgpOwoKICAgICAgICAjIGNoZWNrIGlmIHJldHVybiB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5IHJlZmVyZW5jZQogICAgICAgIGlmICggISRBZG1pbkNoZWNrUmVmIHx8IHJlZiAkQWRtaW5DaGVja1JlZiBuZSAnQVJSQVknIHx8ICFAeyRBZG1pbkNoZWNrUmVmfSApIHsKCiAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgY2hlY2tzIG9mICRHZW5lcmljTW9kdWxlIHJldHVybmVkIG5vIGRhdGEhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgTU9EVUxFOwogICAgICAgIH0KCiAgICAgICAgIyBleHRyYWN0IGFsbCB2YWxpZCBlbGVtZW50cwogICAgICAgIG15IEBDbGVhbmRBZG1pbkNoZWNrUmVmID0gZ3JlcCB7IHJlZigkXykgZXEgJ0hBU0gnIH0gQHskQWRtaW5DaGVja1JlZn07CgogICAgICAgICMgYXR0YWNoIHRoZSBjbGVhbmVkIGVsZW1lbnQgYXJyYXkKICAgICAgICAkRGF0YUhhc2gtPnskRmlsZX0gPSBcQENsZWFuZEFkbWluQ2hlY2tSZWY7CiAgICB9CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0FkbWluQ2hlY2tzR2V0IGVuZCcsCiAgICApOwoKICAgIHJldHVybiAkRGF0YUhhc2g7Cn0KCnN1YiBYTUxTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhEYXRhSGFzaCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCByZWYgJFBhcmFte0RhdGFIYXNofSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdEYXRhSGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnWE1MU3RyaW5nQ3JlYXRlIHN0YXJ0JywKICAgICk7CgogICAgbXkgJFhNTEhhc2ggICAgID0gW107CiAgICBteSAkQ291bnRNb2R1bGUgPSAwOwogICAgbXkgJENvdW50SXRlbSAgID0gMDsKICAgIE1PRFVMRToKICAgIGZvciBteSAkTW9kdWxlICgga2V5cyAleyAkUGFyYW17RGF0YUhhc2h9IH0gKSB7CgogICAgICAgICRDb3VudE1vZHVsZSsrOwogICAgICAgICRYTUxIYXNoLT5bMV0tPntTdXBwb3J0SW5mb30tPlsxXS0+e01vZHVsZX0tPlskQ291bnRNb2R1bGVdLT57TmFtZX0gPSAkTW9kdWxlOwoKICAgICAgICBmb3IgbXkgJERhdGFIYXNoUm93ICggQHsgJFBhcmFte0RhdGFIYXNofS0+eyRNb2R1bGV9IH0gKSB7CgogICAgICAgICAgICAkQ291bnRJdGVtKys7CiAgICAgICAgICAgIG15ICREYXRhID0ge307CgogICAgICAgICAgICBFTEVNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBrZXlzICV7JERhdGFIYXNoUm93fSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQgaWYgJEVsZW1lbnQgZXEgJ05hbWUnOwogICAgICAgICAgICAgICAgJERhdGEtPnskRWxlbWVudH0tPlsxXS0+e0NvbnRlbnR9ID0gJERhdGFIYXNoUm93LT57JEVsZW1lbnR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkWE1MSGFzaC0+WzFdLT57U3VwcG9ydEluZm99LT5bMV0tPntNb2R1bGV9LT5bJENvdW50TW9kdWxlXS0+e0l0ZW19LT5bJENvdW50SXRlbV0KICAgICAgICAgICAgICAgID0gJERhdGE7CgogICAgICAgICAgICAkWE1MSGFzaC0+WzFdLT57U3VwcG9ydEluZm99LT5bMV0tPntNb2R1bGV9LT5bJENvdW50TW9kdWxlXS0+e0l0ZW19LT5bJENvdW50SXRlbV0KICAgICAgICAgICAgICAgIC0+e05hbWV9ID0gJERhdGFIYXNoUm93LT57TmFtZX07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRYTUxTdHJpbmcgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2gyWE1MKCBAeyRYTUxIYXNofSApOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdYTUxTdHJpbmdDcmVhdGUgZW5kJywKICAgICk7CgogICAgcmV0dXJuIFwkWE1MU3RyaW5nOwp9CgpzdWIgTG9nTGFzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJMb2dMYXN0ICckUGFyYW17VHlwZX0nIHN0YXJ0IiwKICAgICk7CgogICAgbXkgJExvZ1N0cmluZyA9ICRTZWxmLT57TG9nT2JqZWN0fS0+R2V0TG9nKCBMaW1pdCA9PiAxMjAwICk7CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkxvZ0xhc3QgJyRQYXJhbXtUeXBlfScgZW5kIiwKICAgICk7CgogICAgcmV0dXJuICggXCRMb2dTdHJpbmcsICRQYXJhbXtUeXBlfSAuICcubG9nJyApOwp9CgpzdWIgTW9kdWxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnTW9kdWxlQ2hlY2sgc3RhcnQnLAogICAgKTsKCiAgICBteSAkSG9tZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBteSAkVG1wU3VtU3RyaW5nOwogICAgbXkgJFRtcExvZzsKICAgIG9wZW4oICRUbXBTdW1TdHJpbmcsICJwZXJsICRIb21lL2Jpbi9vdHJzLkNoZWNrTW9kdWxlcy5wbCB8IiApOwoKICAgIHdoaWxlICg8JFRtcFN1bVN0cmluZz4pIHsKICAgICAgICAkVG1wTG9nIC49ICRfOwogICAgfQogICAgY2xvc2UoJFRtcFN1bVN0cmluZyk7CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ01vZHVsZUNoZWNrIGVuZCcsCiAgICApOwoKICAgIHJldHVybiAoIFwkVG1wTG9nLCAnTW9kdWxlQ2hlY2subG9nJyApOwp9CgpzdWIgQVJDSElWRUxvZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdBUkNISVZFTG9nQ3JlYXRlIHN0YXJ0JywKICAgICk7CgogICAgbXkgJEhvbWUgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgbXkgJEFyY2hpdmUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9BUkNISVZFJzsKCiAgICBteSAkSGFuZGxlOwogICAgaWYgKCAhb3BlbiggJEhhbmRsZSwgJzwnLCAkQXJjaGl2ZSApICkgewogICAgICAgIG15ICRBUkNISVZFRW1wdHkgPSAiQ2FuJ3Qgb3BlbiAkQXJjaGl2ZTogJCEiOwoKICAgICAgICAjIGxvZyBpbmZvCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQVJDSElWRUxvZ0NyZWF0ZSBlbmQnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAoIFwkQVJDSElWRUVtcHR5LCAnQVJDSElWRS5sb2cnICk7CiAgICB9CiAgICBiaW5tb2RlICRIYW5kbGU7CiAgICBteSAlQ29tcGFyZTsKICAgIHdoaWxlICg8JEhhbmRsZT4pIHsKICAgICAgICBteSBAUm93ID0gc3BsaXQoIC86Oi8sICRfICk7CiAgICAgICAgY2hvbXAgJFJvd1sxXTsKICAgICAgICAkQ29tcGFyZXsgJFJvd1sxXSB9ID0gJFJvd1swXTsKICAgIH0KICAgIGNsb3NlICRIYW5kbGU7CgogICAgbXkgJVJlc3VsdCA9ICRTZWxmLT5fQVJDSElWRUxvZ0xvb2t1cCgKICAgICAgICBJbiAgICAgID0+ICRIb21lLAogICAgICAgIENvbXBhcmUgPT4gXCVDb21wYXJlLAogICAgICAgIEhvbWUgICAgPT4gJEhvbWUsCiAgICApOwoKICAgIG15ICRBUkNISVZFU3RyaW5nID0gJyc7CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlUmVzdWx0ICkgewogICAgICAgICRBUkNISVZFU3RyaW5nIC49ICIkUmVzdWx0eyRLZXl9XG4iOwogICAgfQoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnbm90aWNlJywgTWVzc2FnZSA9PiAnQVJDSElWRUxvZ0NyZWF0ZSBlbmQnICk7CgogICAgcmV0dXJuICggXCRBUkNISVZFU3RyaW5nLCAnQVJDSElWRS5sb2cnICk7Cn0KCnN1YiBfQVJDSElWRUxvZ0xvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBMaXN0ID0gZ2xvYigiJFBhcmFte0lufS8qIik7CiAgICBGSUxFOgogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIGNsZWFuIHVwIGRpcmVjdG9yeSBuYW1lCiAgICAgICAgJEZpbGUgPX4gcy9cL1wvL1wvL2c7CgogICAgICAgICMgaWdub3RlIGN2cyBkaXJlY3RvcmllcwogICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvRW50cmllc3xSZXBvc2l0b3J5fFJvb3R8Q1ZTfEFSQ0hJVkUvOwoKICAgICAgICAjIGlmIGl0J3MgYSBkaXJlY3RvcnkKICAgICAgICBpZiAoIC1kICRGaWxlICkgewogICAgICAgICAgICAkU2VsZi0+X0FSQ0hJVkVMb2dMb29rdXAoCiAgICAgICAgICAgICAgICBJbiAgICAgID0+ICRGaWxlLAogICAgICAgICAgICAgICAgQ29tcGFyZSA9PiAkUGFyYW17Q29tcGFyZX0sCiAgICAgICAgICAgICAgICBIb21lICAgID0+ICRQYXJhbXtIb21lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBGSUxFOwoKICAgICAgICAgICAgIyBwcmludCAiRGlyZWN0b3J5OiAkRmlsZVxuIjsKICAgICAgICB9CgogICAgICAgICMgaWYgaXQncyBhIGZpbGUKICAgICAgICBteSAkT3JpZ0ZpbGUgPSAkRmlsZTsKICAgICAgICAkRmlsZSA9fiBzL1xRJFBhcmFte0hvbWV9XEUvLzsKICAgICAgICAkRmlsZSA9fiBzL15cLyguKikkLyQxLzsKCiAgICAgICAgIyBpZ25vcmUgdmFyIGRpcmVjdG9yaWVzCiAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9eZG9jXC8vOwogICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvXnZhclwvdG1wLzsKICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL152YXJcL2FydGljbGUvOwoKICAgICAgICAjIG5leHQgaWYgbm90IHJlYWRhYmxlCiAgICAgICAgbXkgJENvbnRlbnQgPSAnJzsKICAgICAgICBteSAkSW47CiAgICAgICAgaWYgKCAhb3BlbiggJEluLCAnPCcsICRPcmlnRmlsZSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgcmVhZDogJE9yaWdGaWxlOiAkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRklMRTsKICAgICAgICB9CiAgICAgICAgbXkgJGN0eCA9IERpZ2VzdDo6TUQ1LT5uZXc7CiAgICAgICAgJGN0eC0+YWRkZmlsZSgqJEluKTsKICAgICAgICBteSAkRGlnZXN0ID0gJGN0eC0+aGV4ZGlnZXN0KCk7CiAgICAgICAgY2xvc2UgJEluOwogICAgICAgIGlmICggISRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSApIHsKICAgICAgICAgICAgJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9ID0gIk5ldyAkRmlsZSI7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9IG5lICREaWdlc3QgKSB7CiAgICAgICAgICAgICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSA9ICJEaWYgJEZpbGUiOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoIGRlZmluZWQgJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9ICkgewogICAgICAgICAgICBkZWxldGUgJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJXsgJFBhcmFte0NvbXBhcmV9IH07Cn0KCnN1YiBPcG1JbmZvIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdub3RpY2UnLCBNZXNzYWdlID0+ICdPcG1JbmZvIHN0YXJ0JyApOwoKICAgIG15ICRPcG1JbmZvOwogICAgZm9yIG15ICRQYWNrYWdlICggJFNlbGYtPntQYWNrYWdlT2JqZWN0fS0+UmVwb3NpdG9yeUxpc3QoKSApIHsKICAgICAgICAkT3BtSW5mbwogICAgICAgICAgICAuPSAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iOwogICAgICAgICRPcG1JbmZvIC49ICJ8IE5hbWU6ICAgICAgICAkUGFja2FnZS0+e05hbWV9LT57Q29udGVudH1cbiI7CiAgICAgICAgJE9wbUluZm8gLj0gInwgVmVyc2lvbjogICAgICRQYWNrYWdlLT57VmVyc2lvbn0tPntDb250ZW50fVxuIjsKICAgICAgICAkT3BtSW5mbyAuPSAifCBWZW5kb3I6ICAgICAgJFBhY2thZ2UtPntWZW5kb3J9LT57Q29udGVudH1cbiI7CiAgICAgICAgJE9wbUluZm8gLj0gInwgVVJMOiAgICAgICAgICRQYWNrYWdlLT57VVJMfS0+e0NvbnRlbnR9XG4iOwogICAgICAgICRPcG1JbmZvIC49ICJ8IExpY2Vuc2U6ICAgICAkUGFja2FnZS0+e0xpY2Vuc2V9LT57Q29udGVudH1cbiI7CiAgICB9CiAgICAkT3BtSW5mbyAuPSAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnbm90aWNlJywgTWVzc2FnZSA9PiAnT3BtSW5mbyBlbmQnICk7CgogICAgcmV0dXJuICggXCRPcG1JbmZvLCAnSW5zdGFsbGVkUGFja2FnZXMubG9nJyApOwp9CgpzdWIgQXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdub3RpY2UnLCBNZXNzYWdlID0+ICdBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgc3RhcnQnICk7CgogICAgbXkgJEhvbWUgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgbXkgJEFyY2hpdmUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvdG1wL2FwcGxpY2F0aW9uLnRhcic7CgogICAgaWYgKCAtZiAkQXJjaGl2ZSApIHsKICAgICAgICB1bmxpbmsgJEFyY2hpdmUgfHwgZGllICJDYW4ndCB1bmxpbmsgJEFyY2hpdmU6ICQhIjsKICAgIH0KCiAgICBteSBATGlzdDsKICAgIGZvciBteSAkTGlzdEVsZW1lbnQgKCAkU2VsZi0+RGlyZWN0b3J5RmlsZXMoIERpcmVjdG9yeSA9PiAkSG9tZSApICkgewogICAgICAgIGlmICggLXIgJExpc3RFbGVtZW50ICkgewogICAgICAgICAgICBwdXNoIEBMaXN0LCAkTGlzdEVsZW1lbnQ7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgbXkgJFRhck9iamVjdCA9IEFyY2hpdmU6OlRhci0+bmV3KCk7CgogICAgJFRhck9iamVjdC0+YWRkX2ZpbGVzKEBMaXN0KTsKCiAgICAjIE1hc2sgUGFzc3dvcmRzIGluIENvbmZpZy5wbQogICAgbXkgJEhvbWVXaXRob3V0U2xhc2ggPSAkSG9tZTsKICAgICRIb21lV2l0aG91dFNsYXNoID1+IHMvXlwvLy87CiAgICBteSAkQ29uZmlnID0gJFRhck9iamVjdC0+Z2V0X2NvbnRlbnQoIiRIb21lV2l0aG91dFNsYXNoL0tlcm5lbC9Db25maWcucG0iKTsKCiAgICBteSBAVHJpbUFjdGlvbiA9IHF3KAogICAgICAgIERhdGFiYXNlUHcKICAgICAgICBTZWFyY2hVc2VyUHcKICAgICAgICBVc2VyUHcKICAgICAgICBTZW5kbWFpbE1vZHVsZTo6QXV0aFBhc3N3b3JkCiAgICAgICAgQXV0aE1vZHVsZTo6UmFkaXVzOjpQYXNzd29yZAogICAgICAgIFBHUDo6S2V5OjpQYXNzd29yZAogICAgICAgIEN1c3RvbWVyOjpBdXRoTW9kdWxlOjpEQjo6Q3VzdG9tZXJQYXNzd29yZAogICAgICAgIEN1c3RvbWVyOjpBdXRoTW9kdWxlOjpSYWRpdXM6OlBhc3N3b3JkCiAgICApOwoKICAgIFNUUklORzoKICAgIGZvciBteSAkU3RyaW5nIChAVHJpbUFjdGlvbikgewogICAgICAgIG5leHQgU1RSSU5HIGlmICEkU3RyaW5nOwogICAgICAgICRDb25maWcgPX4gcy8oXlxzK1wkU2VsZi4qPyRTdHJpbmcuKj89Lio/KVwnLio/XCc7LyQxXCd4eHhcJzsvbWc7CiAgICB9CiAgICAkQ29uZmlnID1+IHMvKF5ccytQYXNzd29yZC4qPz0+Lio/KVwnLio/XCcsLyQxXCd4eHhcJywvbWc7CgogICAgJFRhck9iamVjdC0+cmVwbGFjZV9jb250ZW50KCAiJEhvbWVXaXRob3V0U2xhc2gvS2VybmVsL0NvbmZpZy5wbSIsICRDb25maWcgKTsKICAgIG15ICRXcml0ZSA9ICRUYXJPYmplY3QtPndyaXRlKCAkQXJjaGl2ZSwgMCApOwogICAgaWYgKCAhJFdyaXRlICkgewoKICAgICAgICAjIGxvZyBpbmZvCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgY2FuJ3Qgd3JpdGUgJEFyY2hpdmU6ICQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFkZCBmaWxlcyB0byB0aGUgdGFyIGFyY2hpdmUKICAgIG15ICRUYXI7CiAgICBpZiAoICFvcGVuKCAkVGFyLCAnPCcsICRBcmNoaXZlICkgKSB7CgogICAgICAgICMgbG9nIGluZm8KICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkFwcGxpY2F0aW9uQXJjaGl2ZUNyZWF0ZSBjYW4ndCByZWFkICRBcmNoaXZlOiAkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgYmlubW9kZSAkVGFyOwogICAgbXkgJFRtcFRhciA9IGRvIHsgbG9jYWwgJC87IDwkVGFyPiB9OwogICAgY2xvc2UgJFRhcjsKCiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ0NvbXByZXNzOjpabGliJykgKSB7CiAgICAgICAgbXkgJEd6VGFyID0gQ29tcHJlc3M6OlpsaWI6Om1lbUd6aXAoJFRtcFRhcik7CgogICAgICAgICMgbG9nIGluZm8KICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgQ29tcHJlc3M6OlpsaWIgZW5kJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gKCBcJEd6VGFyLCAnYXBwbGljYXRpb24udGFyLmd6JyApOwogICAgfQoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgbm8gQ29tcHJlc3M6OlpsaWIgZW5kJywKICAgICk7CgogICAgcmV0dXJuICggXCRUbXBUYXIsICdhcHBsaWNhdGlvbi50YXInICk7Cn0KCnN1YiBEaXJlY3RvcnlGaWxlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KERpcmVjdG9yeSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGRpcmVjdG9yeQogICAgbXkgJEFydGljbGVEaXIgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQXJ0aWNsZURpcicpOwoKICAgICMgY2xlYW51cCBmaWxlIG5hbWUKICAgICRBcnRpY2xlRGlyID1+IHMvXC9cLy9cLy9nOwoKICAgICMgdGVtcCBkaXJlY3RvcnkKICAgIG15ICRUZW1wRGlyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKTsKCiAgICAjIGNsZWFudXAgZmlsZSBuYW1lCiAgICAkVGVtcERpciA9fiBzL1wvXC8vXC8vZzsKCiAgICAjIHJlc2V0IGZpbGUgY291bnQgb24gaW5pdGlhbCBjYWxsCiAgICBpZiAoICEkUGFyYW17TG9vcH0gKSB7CiAgICAgICAgJFNlbGYtPntEaXJlY3RvcnlGaWxlc0NvdW50fSA9IDA7CiAgICB9CgogICAgIyBjaGVjayBhbGwgJFBhcmFte0RpcmVjdG9yeX0vKiBpbiBob21lIGRpcmVjdG9yeQogICAgbXkgQEZpbGVzOwogICAgbXkgQExpc3QgPSBnbG9iKCIkUGFyYW17RGlyZWN0b3J5fS8qIik7CiAgICBGSUxFOgogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIGNsZWFudXAgZmlsZSBuYW1lCiAgICAgICAgJEZpbGUgPX4gcy9cL1wvL1wvL2c7CgogICAgICAgICMgY2hlY2sgaWYgZGlyZWN0b3J5CiAgICAgICAgaWYgKCAtZCAkRmlsZSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IGluY2x1ZGUgQ1ZTIGRpcmVjdG9yaWVzCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvXC9DVlMvOwoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBhcnRpY2xlIGluIGZpbGUgc3lzdGVtCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvXFEkQXJ0aWNsZURpclxFL2k7CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIHRtcCBpbiBmaWxlIHN5c3RlbQogICAgICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL1xRJFRlbXBEaXJcRS9pOwoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBqcy1jYWNoZQogICAgICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL2pzLWNhY2hlLzsKCiAgICAgICAgICAgICMgZG8gbm90IGluY2x1ZGUgY3NzLWNhY2hlCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvY3NzLWNhY2hlLzsKCiAgICAgICAgICAgICMgYWRkIGRpcmVjdG9yeSB0byBsaXN0CiAgICAgICAgICAgIHB1c2ggQEZpbGVzLCAkU2VsZi0+RGlyZWN0b3J5RmlsZXMoIERpcmVjdG9yeSA9PiAkRmlsZSwgTG9vcCA9PiAxICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBoaWRkZW4gZmlsZXMKICAgICAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9eXC4vOwoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBmaWxlcyB3aXRoICMgaW4gZmlsZSBuYW1lCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvIy87CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGlmIGZpbGUgaXMgYmlnZ2VyIHRoZSAwLjQ1IE1CCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAoIC1zICRGaWxlID4gKCAxMDI0ICogMTAyNCAqIDAuNDUgKSApOwoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBpZiBmaWxlIGlzIG5vdCByZWFkYWJsZQogICAgICAgICAgICBuZXh0IEZJTEUgaWYgIS1yICRGaWxlOwoKICAgICAgICAgICAgIyBhZGQgZmlsZSB0byBsaXN0CiAgICAgICAgICAgIHB1c2ggQEZpbGVzLCAkRmlsZTsKCiAgICAgICAgICAgICMgY2hlY2sgdG90YWwgY291bnQgb2YgZmlsZXMgKG1heC4gZmlsZSBjb3VudCkKICAgICAgICAgICAgbXkgJEZpbGVDb3VudE1heCA9IDhfMDAwOwogICAgICAgICAgICAkU2VsZi0+e0RpcmVjdG9yeUZpbGVzQ291bnR9Kys7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntEaXJlY3RvcnlGaWxlc0NvdW50fSA+ICRGaWxlQ291bnRNYXggKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJNYXggZmlsZSBjb3VudCAoJEZpbGVDb3VudE1heCkgZm9yIGFwcGxpY2F0aW9uIGFyY2hpdmUgcmVhY2hlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiBARmlsZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBGaWxlczsKfQoKc3ViIEdldEluc3RhbGxlZFByb2R1Y3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnR2V0SW5zdGFsbGVkUHJvZHVjdCBzdGFydCcsCiAgICApOwoKICAgIG15ICRQcm9kdWN0OwogICAgbXkgJVRvb2wgPSAoCiAgICAgICAgU0lSSU9TICAgICAgICAgICAgICAgPT4gMCwKICAgICAgICBJVFNNICAgICAgICAgICAgICAgICA9PiAwLAogICAgICAgIFdJREF1dGhvcmluZyAgICAgICAgID0+IDAsCiAgICAgICAgV0lEUHVibGljYXRpb25TeXN0ZW0gPT4gMCwKICAgICk7CgogICAgJFByb2R1Y3QgPSAiUHJvZHVjdDogIiAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykgLiAnICcKICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdWZXJzaW9uJyk7CgogICAgZm9yIG15ICRQYWNrYWdlICggJFNlbGYtPntQYWNrYWdlT2JqZWN0fS0+UmVwb3NpdG9yeUxpc3QoKSApIHsKICAgICAgICBmb3IgbXkgJFRvb2xzICgga2V5cyAlVG9vbCApIHsKICAgICAgICAgICAgaWYgKCAkVG9vbHMgPX4gL15cUSRQYWNrYWdlLT57TmFtZX0tPntDb250ZW50fVxFJC8gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRUb29seyRUb29sc30gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkUHJvZHVjdCAuPSAiIC8gJFBhY2thZ2UtPntOYW1lfS0+e0NvbnRlbnR9IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRUb29seyRUb29sc30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHRoZSBwcm9kdWN0IG5hbWUgKHdoaWNoIGNvbnRhaW5zIHRoZSBJVFNNIHZlcnNpb24sIGlmIElUU00gaXMgaW5zdGFsbGVkKQogICAgJFByb2R1Y3QgLj0gJyAvICcgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdE5hbWUnKTsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnR2V0SW5zdGFsbGVkUHJvZHVjdCBlbmQnLAogICAgKTsKCiAgICByZXR1cm4gJFByb2R1Y3Q7Cn0KCnN1YiBTZW5kSW5mbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdTZW5kSW5mbyBzdGFydCcsCiAgICApOwoKICAgICMgY3JlYXRlIGxvZyBwYWNrYWdlCiAgICBteSAoICRMb2dQcmVDb250ZW50LCAkTG9nUHJlRmlsZW5hbWUgKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcHJlJyApOwoKICAgICMgY3JlYXRlIGNoZWNrIHBhY2thZ2UKICAgIG15ICREYXRhSGFzaCA9ICRTZWxmLT5BZG1pbkNoZWNrc0dldCgpOwogICAgbXkgJFhNTENoZWNrID0gJFNlbGYtPlhNTFN0cmluZ0NyZWF0ZSggRGF0YUhhc2ggPT4gJERhdGFIYXNoICk7CgogICAgIyBjcmVhdGUgYXBwbGljYXRpb24gcGFja2FnZQogICAgbXkgKCAkQ29udGVudCwgJEZpbGVuYW1lICkgPSAkU2VsZi0+QXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlKCk7CgogICAgIyBjcmVhdGUgQVJDSElWRSBsb2cgcGFja2FnZQogICAgbXkgKCAkQVJDSElWRUNvbnRlbnQsICRBUkNISVZFRmlsZW5hbWUgKSA9ICRTZWxmLT5BUkNISVZFTG9nQ3JlYXRlKCk7CgogICAgIyBjcmVhdGUgT1BNIEluZm8gcGFja2FnZSBsaWtlIC4vb3BtLnBsIC1hIGxpc3QKICAgIG15ICggJE9QTUluZm9Db250ZW50LCAkT1BNSW5mb0ZpbGVuYW1lICkgPSAkU2VsZi0+T3BtSW5mbygpOwoKICAgICMgY3JlYXRlIG1vZHVsZSBjaGVjayBwYWNrYWdlCiAgICBteSAoICRNb2R1bGVDaGVja0NvbnRlbnQsICRNb2R1bGVDaGVja0ZpbGVuYW1lICkgPSAkU2VsZi0+TW9kdWxlQ2hlY2soKTsKCiAgICAjIGNyZWF0ZSBsb2cgcGFja2FnZQogICAgbXkgKCAkTG9nUG9zdENvbnRlbnQsICRMb2dQb3N0RmlsZW5hbWUgKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcG9zdCcgKTsKCiAgICAjIGNyZWF0ZSBtYWlsIGJvZHkKICAgIG15ICRCb2R5ID0gJyc7CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17Q3VzdG9tZXJJbmZvfSB9ICkgewogICAgICAgIG15ICRJdGVtVmFsdWUgPSAkUGFyYW17Q3VzdG9tZXJJbmZvfS0+eyRLZXl9IHx8ICcnOwogICAgICAgIGlmICggJEtleSBlcSAnU2VuZEluZm8nICYmICRJdGVtVmFsdWUgKSB7CiAgICAgICAgICAgICRJdGVtVmFsdWUgPSAnWWVzJzsKICAgICAgICB9CiAgICAgICAgJEJvZHkgLj0gIiRLZXk6JEl0ZW1WYWx1ZVxuIjsKICAgIH0KCiAgICAjIEdldCB0aGUgRlFETgogICAgbXkgJEZRRE4gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpIHx8ICcnOwogICAgJEJvZHkgLj0gIkZRRE46IiAuICRGUUROIC4gIlxuIjsKCiAgICAjIEdldCB0aGUgb3RycyB2ZXJzaW9uIGFuZCBpZiBpbnN0YWxsZWQgYWRkIG90aGVyIHByb2R1Y3QgaW5mbyBsaWtlIFNJUklPUyBvciBJVFNNLgogICAgJEJvZHkgLj0gJFNlbGYtPkdldEluc3RhbGxlZFByb2R1Y3QoKTsKCiAgICBteSAkU2VuZCA9ICRTZWxmLT57RW1haWxPYmplY3R9LT5TZW5kKAogICAgICAgIEZyb20gICAgICAgPT4gJFBhcmFte0N1c3RvbWVySW5mb30tPntTZW5kZXJ9LAogICAgICAgIFRvICAgICAgICAgPT4gJ3N1cHBvcnRAb3Rycy5jb20nLAogICAgICAgIFN1YmplY3QgICAgPT4gJ1N1cHBvcnQ6OlJlcXVlc3Q6OkF1dG86OkVtYWlsOjpDSEVDSycsCiAgICAgICAgVHlwZSAgICAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgQ2hhcnNldCAgICA9PiAndXRmLTgnLAogICAgICAgIEJvZHkgICAgICAgPT4gJEJvZHksCiAgICAgICAgQXR0YWNobWVudCA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRMb2dQcmVGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JExvZ1ByZUNvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnY2hlY2sueG1sJywKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JFhNTENoZWNrfSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3htbCcsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JENvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRBUkNISVZFRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRBUkNISVZFQ29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRNb2R1bGVDaGVja0ZpbGVuYW1lLAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJHskTW9kdWxlQ2hlY2tDb250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJE9QTUluZm9GaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JE9QTUluZm9Db250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJExvZ1Bvc3RGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JExvZ1Bvc3RDb250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnU2VuZEluZm8gZW5kJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBEb3dubG9hZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdEb3dubG9hZCBzdGFydCcsCiAgICApOwoKICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSwgJHdkLCAkeWQsICRkc3QgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CiAgICBteSAkRmlsZW5hbWUgPSAiU3VwcG9ydEluZm9fJFktJE0tJEQiIC4gJ18nIC4gIiRoLSRtIjsKCiAgICAjIGNyZWF0ZSBsb2cgcGFja2FnZQogICAgbXkgJUZpbGU7CiAgICAoICRGaWxle0xvZ1ByZUNvbnRlbnR9LCAkRmlsZXtMb2dQcmVGaWxlbmFtZX0gKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcHJlJyApOwoKICAgICMgY3JlYXRlIGNoZWNrIHBhY2thZ2UKICAgIG15ICREYXRhSGFzaCA9ICRTZWxmLT5BZG1pbkNoZWNrc0dldCgpOwoKICAgICRGaWxle0NoZWNrQ29udGVudH0gPSAkU2VsZi0+WE1MU3RyaW5nQ3JlYXRlKCBEYXRhSGFzaCA9PiAkRGF0YUhhc2gsICk7CiAgICAkRmlsZXtDaGVja0ZpbGVuYW1lfSA9ICdjaGVjay54bWwnLAoKICAgICAgICAjIGNyZWF0ZSBhcHBsaWNhdGlvbiBwYWNrYWdlCiAgICAgICAgKCAkRmlsZXtBcHBDb250ZW50fSwgJEZpbGV7QXBwRmlsZW5hbWV9ICkgPSAkU2VsZi0+QXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlKCk7CgogICAgIyBjcmVhdGUgQVJDSElWRSBsb2cgcGFja2FnZQogICAgKCAkRmlsZXtBcmNoQ29udGVudH0sICRGaWxle0FyY2hGaWxlbmFtZX0gKSA9ICRTZWxmLT5BUkNISVZFTG9nQ3JlYXRlKCk7CgogICAgIyBjcmVhdGUgT1BNIEluZm8gcGFja2FnZSBsaWtlIC4vb3BtLnBsIC1hIGxpc3QKICAgICggJEZpbGV7T1BNSW5mb0NvbnRlbnR9LCAkRmlsZXtPUE1JbmZvRmlsZW5hbWV9ICkgPSAkU2VsZi0+T3BtSW5mbygpOwoKICAgICMgY3JlYXRlIG1vZHVsZSBjaGVjayBwYWNrYWdlCiAgICAoICRGaWxle01vZHVsZUNoZWNrQ29udGVudH0sICRGaWxle01vZHVsZUNoZWNrRmlsZW5hbWV9ICkgPSAkU2VsZi0+TW9kdWxlQ2hlY2soKTsKCiAgICAjIGNyZWF0ZSBsb2cgcGFja2FnZQogICAgKCAkRmlsZXtMb2dQb3N0Q29udGVudH0sICRGaWxle0xvZ1Bvc3RGaWxlbmFtZX0gKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcG9zdCcgKTsKCiAgICAjIGNyZWF0ZSBtYWlsIGJvZHkKICAgIG15ICRCb2R5ID0gJyc7CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRCb2R5IC49ICIkS2V5OiRQYXJhbXskS2V5fVxuIjsKICAgIH0KICAgICRCb2R5IC49ICJGUUROOiIgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpIC4gIlxuIjsKICAgICRCb2R5IC49ICRTZWxmLT5HZXRJbnN0YWxsZWRQcm9kdWN0KCk7CgogICAgJEZpbGV7Qm9keUNvbnRlbnR9ICA9IFwkQm9keTsKICAgICRGaWxle0JvZHlGaWxlbmFtZX0gPSAnQm9keS50eHQnOwoKICAgICMgc2F2ZSBhbmQgY3JlYXRlIGFyY2hpdmUKICAgIG15ICRUZW1wRGlyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKSAuICcvc3VwcG9ydGluZm8vJzsKCiAgICBpZiAoICEtZCAkVGVtcERpciApIHsKICAgICAgICBta2RpciAkVGVtcERpcjsKICAgIH0KCiAgICAjIHJlbW92ZSBhbGwgZmlsZXMKICAgIG15IEBMaXN0T2xkID0gZ2xvYiggJFRlbXBEaXIgLiAnLyonICk7CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0T2xkKSB7CiAgICAgICAgdW5saW5rICRGaWxlOwogICAgfQoKICAgIG15IEBMaXN0OwogICAgZm9yIG15ICRLZXkgKHF3KEJvZHkgTG9nUHJlIENoZWNrIEFwcCBBcmNoIE1vZHVsZUNoZWNrIExvZ1Bvc3QgT1BNSW5mbykpIHsKICAgICAgICBpZiAoICRGaWxleyAkS2V5IC4gJ0ZpbGVuYW1lJyB9ICYmICRGaWxleyAkS2V5IC4gJ0NvbnRlbnQnIH0gKSB7CiAgICAgICAgICAgIG15ICRGaWxlbmFtZSA9ICRUZW1wRGlyIC4gJy8nIC4gJEZpbGV7ICRLZXkgLiAnRmlsZW5hbWUnIH07CiAgICAgICAgICAgIG9wZW4oIG15ICRPdXQsICc+JywgJEZpbGVuYW1lICk7CiAgICAgICAgICAgIGJpbm1vZGUoJE91dCk7CiAgICAgICAgICAgIHByaW50ICRPdXQgJHsgJEZpbGV7ICRLZXkgLiAnQ29udGVudCcgfSB9OwogICAgICAgICAgICBjbG9zZSAkT3V0OwogICAgICAgICAgICBwdXNoIEBMaXN0LCAkRmlsZW5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgbXkgJEFyY2hpdmUgICA9ICRUZW1wRGlyIC4gJy8nIC4gJEZpbGVuYW1lOwogICAgbXkgJFRhck9iamVjdCA9IEFyY2hpdmU6OlRhci0+bmV3KCk7CiAgICAkVGFyT2JqZWN0LT5hZGRfZmlsZXMoQExpc3QpOwogICAgJFRhck9iamVjdC0+d3JpdGUoICRBcmNoaXZlLCAwICkgfHwgZGllICJDb3VsZCBub3Qgd3JpdGU6ICRfISI7CgogICAgIyBhZGQgZmlsZXMgdG8gdGhlIHRhciBhcmNoaXZlCiAgICBvcGVuKCBteSAkVGFyLCAnPCcsICRBcmNoaXZlICk7CiAgICBiaW5tb2RlICRUYXI7CiAgICBteSAkVG1wVGFyID0gZG8geyBsb2NhbCAkLzsgPCRUYXI+IH07CiAgICBjbG9zZSAkVGFyOwoKICAgICMgcmVtb3ZlIGFsbCBmaWxlcwogICAgQExpc3RPbGQgPSBnbG9iKCAkVGVtcERpciAuICcvKicgKTsKICAgIGZvciBteSAkRmlsZSAoQExpc3RPbGQpIHsKICAgICAgICB1bmxpbmsgJEZpbGU7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdDb21wcmVzczo6WmxpYicpICkgewogICAgICAgIG15ICRHelRhciA9IENvbXByZXNzOjpabGliOjptZW1HemlwKCRUbXBUYXIpOwoKICAgICAgICAjIGxvZyBpbmZvCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRG93bmxvYWQgQ29tcHJlc3M6OlpsaWIgZW5kJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gKCBcJEd6VGFyLCAkRmlsZW5hbWUgLiAnLnRhci5neicgKTsKICAgIH0KCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnRG93bmxvYWQgbm8gQ29tcHJlc3M6OlpsaWIgZW5kJywKICAgICk7CgogICAgcmV0dXJuICggXCRUbXBUYXIsICRGaWxlbmFtZSAuICcudGFyJyApOwp9CgpzdWIgQmVuY2htYXJrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEluc2VydCA9ICRQYXJhbXtJbnNlcnR9OwogICAgbXkgJFVwZGF0ZSA9ICRQYXJhbXtVcGRhdGV9OwogICAgbXkgJFNlbGVjdCA9ICRQYXJhbXtTZWxlY3R9OwogICAgbXkgJE1vZGUgICA9ICRQYXJhbXtNb2RlfTsKCiAgICBmb3IgKCAxIC4uICRNb2RlICkgewogICAgICAgICRTZWxmLT57IkRCT2JqZWN0JF8ifSA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCAleyRTZWxmfSApOwogICAgfQoKICAgICRQYXJhbXtJbnNlcnRUaW1lfSA9IDA7CiAgICAkUGFyYW17VXBkYXRlVGltZX0gPSAwOwogICAgJFBhcmFte1NlbGVjdFRpbWV9ID0gMDsKICAgICRQYXJhbXtEZWxldGVUaW1lfSA9IDA7CiAgICBteSAkVGltZVN0YXJ0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgJFNlbGYtPl9TUUxJbnNlcnQoICRJbnNlcnQsICRNb2RlICk7CiAgICBteSAkVGltZTEgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAkU2VsZi0+X1NRTFVwZGF0ZSggJFVwZGF0ZSwgJE1vZGUgKTsKICAgIG15ICRUaW1lMiA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKICAgICRTZWxmLT5fU1FMU2VsZWN0KCAkU2VsZWN0LCAkTW9kZSApOwogICAgbXkgJFRpbWUzID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgJFNlbGYtPl9TUUxEZWxldGUoICRJbnNlcnQsICRNb2RlICk7CiAgICBteSAkVGltZTQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAkUGFyYW17SW5zZXJ0VGltZX0gPSAkUGFyYW17SW5zZXJ0VGltZX0gKyAkVGltZTEgLSAkVGltZVN0YXJ0OwogICAgJFBhcmFte1VwZGF0ZVRpbWV9ID0gJFBhcmFte1VwZGF0ZVRpbWV9ICsgJFRpbWUyIC0gJFRpbWUxOwogICAgJFBhcmFte1NlbGVjdFRpbWV9ID0gJFBhcmFte1NlbGVjdFRpbWV9ICsgJFRpbWUzIC0gJFRpbWUyOwogICAgJFBhcmFte0RlbGV0ZVRpbWV9ID0gJFBhcmFte0RlbGV0ZVRpbWV9ICsgJFRpbWU0IC0gJFRpbWUzOwoKICAgIG15ICRJbnNlcnRUaW1lID0gKCAkUGFyYW17SW5zZXJ0VGltZX0gLyAkTW9kZSApICogKCAxMDAwMCAvICRJbnNlcnQgKTsKICAgIGlmICggJEluc2VydFRpbWUgPD0gMyApIHsKICAgICAgICAkUGFyYW17SW5zZXJ0UmVzdWx0fSA9ICdGaW5lJzsKICAgIH0KICAgIGVsc2lmICggJEluc2VydFRpbWUgPD0gNSApIHsKICAgICAgICAkUGFyYW17SW5zZXJ0UmVzdWx0fSA9ICdPSyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17SW5zZXJ0UmVzdWx0fSAgICAgPSAnV3JvbmcnOwogICAgICAgICRQYXJhbXtJbnNlcnRTaG91bGRUYWtlfSA9IGludCggJE1vZGUgKiA1ICk7CiAgICB9CgogICAgbXkgJFVwZGF0ZVRpbWUgPSAoICRQYXJhbXtVcGRhdGVUaW1lfSAvICRNb2RlICkgKiAoIDEwMDAwIC8gJFVwZGF0ZSApOwogICAgaWYgKCAkVXBkYXRlVGltZSA8PSA1ICkgewogICAgICAgICRQYXJhbXtVcGRhdGVSZXN1bHR9ID0gJ0ZpbmUnOwogICAgfQogICAgZWxzaWYgKCAkVXBkYXRlVGltZSA8PSA5ICkgewogICAgICAgICRQYXJhbXtVcGRhdGVSZXN1bHR9ID0gJ09LJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtVcGRhdGVSZXN1bHR9ICAgICA9ICdXcm9uZyc7CiAgICAgICAgJFBhcmFte1VwZGF0ZVNob3VsZFRha2V9ID0gaW50KCAkTW9kZSAqIDkgKTsKICAgIH0KCiAgICBteSAkU2VsZWN0VGltZSA9ICggJFBhcmFte1NlbGVjdFRpbWV9IC8gJE1vZGUgKSAqICggMTAwMDAgLyAkU2VsZWN0ICk7CiAgICBpZiAoICRTZWxlY3RUaW1lIDw9IDUgKSB7CiAgICAgICAgJFBhcmFte1NlbGVjdFJlc3VsdH0gPSAnRmluZSc7CiAgICB9CiAgICBlbHNpZiAoICRTZWxlY3RUaW1lIDw9IDYgKSB7CiAgICAgICAgJFBhcmFte1NlbGVjdFJlc3VsdH0gPSAnT0snOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1NlbGVjdFJlc3VsdH0gICAgID0gJ1dyb25nJzsKICAgICAgICAkUGFyYW17U2VsZWN0U2hvdWxkVGFrZX0gPSBpbnQoICRNb2RlICogNiApOwogICAgfQoKICAgIG15ICREZWxldGVUaW1lID0gKCAkUGFyYW17RGVsZXRlVGltZX0gLyAkTW9kZSApOwogICAgaWYgKCAkRGVsZXRlVGltZSA8PSA0ICkgewogICAgICAgICRQYXJhbXtEZWxldGVSZXN1bHR9ID0gJ0ZpbmUnOwogICAgfQogICAgZWxzaWYgKCAkRGVsZXRlVGltZSA8PSA1ICkgewogICAgICAgICRQYXJhbXtEZWxldGVSZXN1bHR9ID0gJ09LJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtEZWxldGVSZXN1bHR9ICAgICA9ICdXcm9uZyc7CiAgICAgICAgJFBhcmFte0RlbGV0ZVNob3VsZFRha2V9ID0gaW50KCAkTW9kZSAqIDUgKTsKICAgIH0KCiAgICAjIHJlbW92ZSBhbGwgcm93cyBpbiB0aGUgYmVuY2ggdGVzdCB0YWJsZQogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gc3VwcG9ydF9iZW5jaF90ZXN0JywKICAgICk7CgogICAgcmV0dXJuICVQYXJhbTsKfQoKc3ViIF9TUUxJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJENvdW50LCAkTW9kZSApID0gQF87CgogICAgZm9yIG15ICRDICggMSAuLiAkQ291bnQgKSB7CiAgICAgICAgZm9yIG15ICRNICggMSAuLiAkTW9kZSApIHsKCiAgICAgICAgICAgIG15ICRWYWx1ZTEgPSAiYWFhJEMtJE0iOwogICAgICAgICAgICBteSAkVmFsdWUyID0gaW50IHJhbmQgMTAwMDAwMDsKCiAgICAgICAgICAgICRTZWxmLT57IkRCT2JqZWN0JE0ifS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHN1cHBvcnRfYmVuY2hfdGVzdCAobmFtZV9hLCBuYW1lX2IpIHZhbHVlcyAoPywgPyknLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkVmFsdWUxLCBcJFZhbHVlMiwgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9TUUxVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJENvdW50LCAkTW9kZSApID0gQF87CgogICAgZm9yIG15ICRDICggMSAuLiAkQ291bnQgKSB7CiAgICAgICAgZm9yIG15ICRNICggMSAuLiAkTW9kZSApIHsKCiAgICAgICAgICAgIG15ICRWYWx1ZU9sZCA9ICJhYWEkQy0kTSI7CiAgICAgICAgICAgIG15ICRWYWx1ZTEgICA9ICJiYmIkQy0kTSI7CiAgICAgICAgICAgIG15ICRWYWx1ZTIgICA9IGludCByYW5kIDEwMDAwMDA7CgogICAgICAgICAgICAkU2VsZi0+eyJEQk9iamVjdCRNIn0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICdVUERBVEUgc3VwcG9ydF9iZW5jaF90ZXN0IFNFVCBuYW1lX2EgPSA/LCBuYW1lX2IgPSA/IFdIRVJFIG5hbWVfYSA9ID8nLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkVmFsdWUxLCBcJFZhbHVlMiwgXCRWYWx1ZU9sZCBdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1NRTFNlbGVjdCB7CiAgICBteSAoICRTZWxmLCAkQ291bnQsICRNb2RlICkgPSBAXzsKCiAgICBmb3IgbXkgJEMgKCAxIC4uICRDb3VudCApIHsKICAgICAgICBmb3IgbXkgJE0gKCAxIC4uICRNb2RlICkgewoKICAgICAgICAgICAgbXkgJFZhbHVlID0gImJiYiRDLSRNIjsKCiAgICAgICAgICAgICRTZWxmLT57IkRCT2JqZWN0JE1vZGUifS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCAgPT4gIlNFTEVDVCBuYW1lX2EsIG5hbWVfYiBGUk9NIHN1cHBvcnRfYmVuY2hfdGVzdCBXSEVSRSBuYW1lX2EgPSA/IiwKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFZhbHVlIF0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+eyJEQk9iamVjdCRNIn0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdGhpbmcKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1NRTERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAkQ291bnQsICRNb2RlICkgPSBAXzsKCiAgICBmb3IgbXkgJEMgKCAxIC4uICRDb3VudCApIHsKICAgICAgICBmb3IgbXkgJE0gKCAxIC4uICRNb2RlICkgewoKICAgICAgICAgICAgbXkgJFZhbHVlID0gImJiYiRDb3VudC0kTW9kZSI7CgogICAgICAgICAgICAkU2VsZi0+eyJEQk9iamVjdCRNIn0tPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gc3VwcG9ydF9iZW5jaF90ZXN0IFdIRVJFIG5hbWVfYSA9ID8nLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkVmFsdWUgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNDguMi4zICQgJERhdGU6IDIwMTIvMDgvMTcgMTE6Mjk6MzMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGFiYXNlLnBtLHYgMS4xMiAyMDEwLzAyLzA5IDE5OjU0OjE3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uIHRvIGEgcnVubmluZyBPVFJTIGhvc3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBEYXRhYmFzZSBpbmZvIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2UtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBBZG1pbkNoZWNrcyBpbmZvcm1hdGlvbi4KCiREYXRhYmFzZUFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZGF0YWJhc2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiAgICAjICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwogICAgIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IHVzZWQgZGF0YWJhc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHRyeSB0byBmaW5kIG91dCB3aGljaCB0aWNrZXQgZGF0YWJhc2UgaXMgY29uZmlndXJlZAogICAgbXkgJERhdGFiYXNlVHlwZSA9ICRTZWxmLT57REJPYmplY3R9LT57J0RCOjpUeXBlJ307CgogICAgIyB0cnkgdG8gZ2V0IGF2YWlsYWJsZSBtb2R1bGVzIGFuZCB0aGUgZGlyZWN0b3J5IG5hbWUKICAgIG15ICREaXJOYW1lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvS2VybmVsL1N5c3RlbS9TdXBwb3J0L0RhdGFiYXNlIjsKCiAgICAjIHJlYWQgYWxsIGF2YWlsYWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoICREaXJOYW1lIC4gIi8qLnBtIiApOwogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgaWYgKCAkRGF0YWJhc2VUeXBlID1+IC9PREJDL2kgKSB7CiAgICAgICAgICAgICREYXRhYmFzZVR5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGF0YWJhc2U6OlR5cGUnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRGF0YWJhc2VUeXBlID1+IC9eJEZpbGUvaSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjokRmlsZSI7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKICAgICAgICAgICAgICAgIGlmICgkU3VwcG9ydE9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5BZG1pbkNoZWNrc0dldCgpOwogICAgICAgICAgICAgICAgICAgIGlmICggJEFycmF5UmVmICYmIHJlZigkQXJyYXlSZWYpIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7JERhdGFBcnJheX0sIEB7JEFycmF5UmVmfSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEyICQgJERhdGU6IDIwMTAvMDIvMDkgMTk6NTQ6MTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PUy5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9TLnBtLHYgMS4yNSAyMDExLzA4LzI5IDEwOjI5OjI2IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpPUzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yNSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhNYWluT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6Ok9TJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfRGlzdHJpYnV0aW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCAkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxkYXJ3aW4pL2kgKSB7CiAgICAgICAgbXkgJFRtcExpbmUgPSAiIjsKICAgICAgICBteSAkRGlzdHJpYnV0aW9uOwogICAgICAgIGlmICggJF5PID1+IC9kYXJ3aW4vaSAmJiBvcGVuKCAkRGlzdHJpYnV0aW9uLCAic3dfdmVycyB8IiApICkgewogICAgICAgICAgICB3aGlsZSAoPCREaXN0cmlidXRpb24+KSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkVG1wTGluZSA9fiBzL1xcLiovLzsKICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9cbi8gL2c7CiAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAiXCIkVG1wTGluZVwiIGlzIHVzZWQuIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgICAgIH07CgogICAgICAgIH0KICAgICAgICBlbHNpZiAoICReTyA9fiAvbGludXgvaSApIHsKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAnRGlzdHJpYnV0aW9uIHVua25vd24uJzsKICAgICAgICAgICAgJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnTGludXg6OkRpc3RyaWJ1dGlvbicpOwogICAgICAgICAgICBteSAkRGlzdHJpYnV0aW9uTmFtZSA9IExpbnV4OjpEaXN0cmlidXRpb246OmRpc3RyaWJ1dGlvbl9uYW1lKCk7CiAgICAgICAgICAgIGlmICgkRGlzdHJpYnV0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgbXkgJERpc3RyaWJ1dGlvblZlcnNpb24gPSBMaW51eDo6RGlzdHJpYnV0aW9uOjpkaXN0cmlidXRpb25fdmVyc2lvbigpIHx8ICcnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkRGlzdHJpYnV0aW9uTmFtZSAuICcgJyAuICREaXN0cmlidXRpb25WZXJzaW9uIC4gJyBpcyB1c2VkLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRGlzdHJpYnV0aW9uJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBvcGVuKCAkRGlzdHJpYnV0aW9uLCAnPCcsICIvZXRjL2lzc3VlIiApICkgewogICAgICAgICAgICB3aGlsZSAoPCREaXN0cmlidXRpb24+KSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkRGlzdHJpYnV0aW9uKTsKICAgICAgICAgICAgaWYgKCRUbXBMaW5lKSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL1xcLiovLzsKICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXG4vL2c7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRGlzdHJpYnV0aW9uJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlwiJFRtcExpbmVcIiBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAiQ2FuXCd0IGRldGVybWluZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJF5PID1+IC93aW4vaSApIHsKICAgICAgICAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdXaW4zMicpOwogICAgICAgIG15IEBXaW5WZXJzaW9uOwogICAgICAgIG5vIHN0cmljdCAncmVmcyc7CiAgICAgICAgaWYgKCBkZWZpbmVkICZXaW4zMjo6R2V0T1NEaXNwbGF5TmFtZSApIHsKICAgICAgICAgICAgQFdpblZlcnNpb24gPSBXaW4zMjo6R2V0T1NEaXNwbGF5TmFtZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgQFdpblZlcnNpb24gPSBXaW4zMjo6R2V0T1NOYW1lKCk7CiAgICAgICAgfQogICAgICAgIHVzZSBzdHJpY3Q7CiAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEaXN0cmlidXRpb24nLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJAV2luVmVyc2lvbiBpcyB1c2VkLiIsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgfTsKICAgIH0KICAgIGVsc2lmICggJF5PID1+IC9mcmVlYnNkL2kgKSB7CiAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEaXN0cmlidXRpb24nLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICIkXk8gaXMgdXNlZC4iLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnT0snLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBfS2VybmVsSW5mb0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICggJF5PID1+IC8obGludXh8dW5peHxuZXRic2R8ZnJlZWJzZHxkYXJ3aW4pL2kgKSB7CiAgICAgICAgbXkgJFRtcExpbmUgPSAiIjsKICAgICAgICBteSAkS2VybmVsSW5mbzsKICAgICAgICBpZiAoIG9wZW4oICRLZXJuZWxJbmZvLCAidW5hbWUgLWEgfCIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkS2VybmVsSW5mbz4pIHsKICAgICAgICAgICAgICAgICRUbXBMaW5lIC49ICRfOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRLZXJuZWxJbmZvKTsKICAgICAgICAgICAgaWYgKCRUbXBMaW5lKSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL15ccysvL2c7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnS2VybmVsIFZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBLZXJuZWwgdmVyc2lvbi4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJcIiRUbXBMaW5lXCIgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdLZXJuZWwgVmVyc2lvbicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgS2VybmVsIHZlcnNpb24uIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW5cJ3QgZXhlY3V0ZSB1bmFtZSAtYS4uLiIsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAnQ3JpdGljYWwnLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJF5PID1+IC93aW4vaSApIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBfUGVybENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKCiAgICAjIGNoZWNrIHZlcmlzb24gc3RyaW5nCiAgICBteSAkVmVyc2lvbiA9IHNwcmludGYgIiV2ZCIsICReVjsKICAgIG15ICRPUyAgICAgID0gc3ByaW50ZiAiJF5PIiwgJF5WOwogICAgaWYgKCAkVmVyc2lvbiA9fiAvKFxkKylcLihcZCspXC4oXGQrKS9pICkgewogICAgICAgIGlmICggJDEgPD0gNSAmJiAkMiA8PSA4ICYmICQzIDw9IDcgKSB7CiAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BlcmxDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgUGVybCB2ZXJzaW9uLiIsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+CiAgICAgICAgICAgICAgICAgICAgIllvdXIgUGVybCAkVmVyc2lvbiAoJE9TKSBpcyB0byBvbGQsIHlvdSBzaG91bGQgdXBncmFkZSB0byBQZXJsIDUuOC44IG9yIGhpZ2hlci4iLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ0ZhaWxlZCcsCiAgICAgICAgICAgIH07CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUGVybENoZWNrJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBQZXJsIFZlcnNpb24uIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJQZXJsICRWZXJzaW9uICgkT1MpIGlzIHVzZWQuIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQZXJsQ2hlY2snLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgUGVybCBWZXJzaW9uLiIsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJVbmFibGUgdG8gcGFyc2UgdmVyc2lvbiBzdHJpbmcgKCRWZXJzaW9uIC8gJE9TKS4iLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnQ3JpdGljYWwnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBfUGVybE1vZHVsZXNDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICBteSAkSG9tZSAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBteSAkVG1wU3VtU3RyaW5nOwoKICAgIGlmICggb3BlbiggJFRtcFN1bVN0cmluZywgInBlcmwgJEhvbWUvYmluL290cnMuQ2hlY2tNb2R1bGVzLnBsIHwiICkgKSB7CgogICAgICAgIG15ICRUbXBMb2c7CiAgICAgICAgb3BlbiggJFRtcFN1bVN0cmluZywgInBlcmwgJEhvbWUvYmluL290cnMuQ2hlY2tNb2R1bGVzLnBsIHwiICk7CgogICAgICAgIHdoaWxlICg8JFRtcFN1bVN0cmluZz4pIHsKICAgICAgICAgICAgJFRtcExvZyAuPSAkXzsKICAgICAgICB9CiAgICAgICAgY2xvc2UoJFRtcFN1bVN0cmluZyk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFRtcExvZyA9fiBte05vdCBccyBpbnN0YWxsZWQhIFxzIFwoUmVxdWlyZWR9c214CiAgICAgICAgICAgIHx8ICRUbXBMb2cgPX4gbXtmYWlsZWQhfXNteAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQZXJsTW9kdWxlc0NoZWNrJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBQZXJsIE1vZHVsZXMgaW5zdGFsbGVkLiIsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+CiAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGlzIGFuIGVycm9yIGluIHlvdXIgaW5zdGFsbGVkIHBlcmwgbW9kdWxlcyBjb25maWd1cmF0aW9uLiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuIgogICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgICAgIEJsb2NrU3R5bGUgICAgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIENvbnRlbnRTdHJpbmcgPT4gJFRtcExvZywKICAgICAgICAgICAgfTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1BlcmxNb2R1bGVzQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiQ2hlY2sgUGVybCBNb2R1bGVzIGluc3RhbGxlZC4iLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAiQWxsIFBlcmwgbW9kdWxlcyBuZWVkZWQgYXJlIGN1cnJlbnRseSBpbnN0YWxsZWQuIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIEJsb2NrU3R5bGUgICAgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIENvbnRlbnRTdHJpbmcgPT4gJFRtcExvZywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BlcmxNb2R1bGVzQ2hlY2snLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgUGVybCBNb2R1bGVzIGluc3RhbGxlZC4iLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAiVW5hYmxlIHRvIGNoZWNrIFBlcmwgbW9kdWxlcy4iLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnQ3JpdGljYWwnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBfTWVtb3J5U3dhcENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgIG15ICRNZW1JbmZvRmlsZTsKICAgIG15ICRNZW1Ub3RhbDsKICAgIG15ICRNZW1GcmVlOwogICAgbXkgJFN3YXBUb3RhbDsKICAgIG15ICRTd2FwRnJlZTsKCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICggJF5PID1+IC8obGludXh8dW5peHxuZXRic2R8ZnJlZWJzZHxkYXJ3aW4pL2kgKSB7CiAgICAgICAgaWYgKCBvcGVuKCAkTWVtSW5mb0ZpbGUsICc8JywgIi9wcm9jL21lbWluZm8iICkgKSB7CiAgICAgICAgICAgIHdoaWxlICg8JE1lbUluZm9GaWxlPikgewogICAgICAgICAgICAgICAgbXkgJFRtcExpbmUgPSAkXzsKICAgICAgICAgICAgICAgIGlmICggJFRtcExpbmUgPX4gL01lbVRvdGFsLyApIHsKICAgICAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL14uKj8oXGQrKS4qJC8kMS87CiAgICAgICAgICAgICAgICAgICAgJE1lbVRvdGFsID0gaW50KCRUbXBMaW5lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFRtcExpbmUgPX4gL01lbUZyZWUvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtRnJlZSA9IGludCgkVG1wTGluZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRUbXBMaW5lID1+IC9Td2FwVG90YWwvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkU3dhcFRvdGFsID0gaW50KCRUbXBMaW5lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFRtcExpbmUgPX4gL1N3YXBGcmVlLyApIHsKICAgICAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL14uKj8oXGQrKS4qJC8kMS87CiAgICAgICAgICAgICAgICAgICAgJFN3YXBGcmVlID0gaW50KCRUbXBMaW5lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkTWVtSW5mb0ZpbGUpOwoKICAgICAgICAgICAgIyBidWlsZCByZXR1cm4gaGFzaAogICAgICAgICAgICBteSAkRGVzY3JpYnRpb24KICAgICAgICAgICAgICAgID0gIlRoZSBIb3N0IFN5c3RlbSBoYXM6IFxuIgogICAgICAgICAgICAgICAgLiBpbnQoICRNZW1Ub3RhbCAvIDEwMjQgKQogICAgICAgICAgICAgICAgLiAiIE1CIE1lbW9yeSB0b3RhbCBcbiIKICAgICAgICAgICAgICAgIC4gaW50KCAkTWVtRnJlZSAvIDEwMjQgKQogICAgICAgICAgICAgICAgLiAiIE1CIE1lbW9yeSBmcmVlIFxuIgogICAgICAgICAgICAgICAgLiBpbnQoICRTd2FwVG90YWwgLyAxMDI0ICkKICAgICAgICAgICAgICAgIC4gIiBNQiBTd2FwIHRvdGFsIFxuIgogICAgICAgICAgICAgICAgLiBpbnQoICRTd2FwRnJlZSAvIDEwMjQgKQogICAgICAgICAgICAgICAgLiAiIE1CIFN3YXAgZnJlZSAiOwoKICAgICAgICAgICAgaWYgKCAhJFN3YXBUb3RhbCApIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdNZW1vcnkgU3dhcCBDaGVjaycsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJTd2FwRnJlZSA6IFN3YXBUb3RhbCA8IDYwICUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgb3IgaWYgbW9yZSB0aGFuIDIwMCBNQiBTd2FwIGlzIHVzZWQuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICJObyBTd2FwIGVuYWJsZWQhIiwKICAgICAgICAgICAgICAgICAgICBDaGVjayAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggKCRTd2FwRnJlZSkgLyAoJFN3YXBUb3RhbCkgPCA2MCApCiAgICAgICAgICAgICAgICB8fCAoICgkU3dhcFRvdGFsKSAtICgkU3dhcEZyZWUpID4gMjAwMDAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTWVtb3J5IFN3YXAgQ2hlY2snLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiU3dhcEZyZWUgOiBTd2FwVG90YWwgPCA2MCAlICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAiJERlc2NyaWJ0aW9uIiwKICAgICAgICAgICAgICAgICAgICBDaGVjayAgID0+ICdPSycsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ01lbW9yeSBTd2FwIENoZWNrJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQSBNZW1vcnkgQ2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9DUFVMb2FkQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSBAU3BsaXRBcnJheTsKCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICggJF5PID1+IC8obGludXh8dW5peHxuZXRic2R8ZnJlZWJzZHxkYXJ3aW4pL2kgKSB7CgogICAgICAgICMgbGludXggc3lzdGVtcwogICAgICAgIGlmICggLWUgIi9wcm9jL2xvYWRhdmciICkgewogICAgICAgICAgICBteSAkTG9hZEZpbGU7CiAgICAgICAgICAgIG9wZW4oICRMb2FkRmlsZSwgJzwnLCAiL3Byb2MvbG9hZGF2ZyIgKTsKICAgICAgICAgICAgd2hpbGUgKDwkTG9hZEZpbGU+KSB7CiAgICAgICAgICAgICAgICBAU3BsaXRBcnJheSA9IHNwbGl0KCAiICIsICRfICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJExvYWRGaWxlKTsKICAgICAgICB9CgogICAgICAgICMgbWFjIG9zCiAgICAgICAgZWxzaWYgKCAkXk8gPX4gL2Rhcndpbi9pICkgewogICAgICAgICAgICBpZiAoIG9wZW4oIG15ICRJbiwgInN5c2N0bCB2bS5sb2FkYXZnIHwiICkgKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoPCRJbj4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIG15ICgkTG9hZHMpID0gJF8gPX4gL3ZtXC5sb2FkYXZnOiBccyogXHsgXHMqICAoLiopIFxzKiBcfS9zbXggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEBTcGxpdEFycmF5ID0gc3BsaXQgJyAnLCAkTG9hZHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xvc2UgJEluOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoQFNwbGl0QXJyYXkpIHsKCiAgICAgICAgICAgICMgYnVpbGQgcmV0dXJuIGhhc2gKICAgICAgICAgICAgbXkgJERlc2NyaWJ0aW9uCiAgICAgICAgICAgICAgICA9ICJUaGUgSG9zdCBTeXN0ZW0gaGFzIGEgbG9hZDogXG4iCiAgICAgICAgICAgICAgICAuICRTcGxpdEFycmF5WzBdCiAgICAgICAgICAgICAgICAuICIgaW4gdGhlIGxhc3QgMSBtaW51dGUgXG4iCiAgICAgICAgICAgICAgICAuICRTcGxpdEFycmF5WzFdCiAgICAgICAgICAgICAgICAuICIgaW4gdGhlIGxhc3QgNSBtaW51dGVzIFxuIgogICAgICAgICAgICAgICAgLiAkU3BsaXRBcnJheVsyXQogICAgICAgICAgICAgICAgLiAiIGluIHRoZSBsYXN0IDE1IG1pbnV0ZXMiOwoKICAgICAgICAgICAgaWYgKCAkU3BsaXRBcnJheVsyXSA8ICcxLjAwJyApIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdDUFUgTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRoZSBzeXN0ZW0gbG9hZCBpbiB0aGUgbGFzdCAxNSBtaW51dGVzID4gMS4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnT0snLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdDUFUgTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRoZSBzeXN0ZW0gbG9hZCBpbiB0aGUgbGFzdCAxNSBtaW51dGVzIDwgMS4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgX0Rpc2tVc2FnZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgICAgPSB7fTsKICAgIG15ICRDaGVjayAgID0gJ09LJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoICReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGZyZWVic2R8ZGFyd2luKS9pICkgewogICAgICAgIG15ICRDb21tYW5kbGluZSA9ICJkZiAtbHggdG1wZnMgLXggaXNvOTk2MCAteCB1ZGYiOwoKICAgICAgICAjIGN1cnJlbnQgTWFjT1MgZG9lcyBub3Qgc3VwcG9ydCB0aGUgLXggZmxhZyBmb3IgZGYKCiAgICAgICAgaWYgKCAkXk8gPX4gL2Rhcndpbi9pICkgewogICAgICAgICAgICAkQ29tbWFuZGxpbmUgPSAiZGYgLWwiOwogICAgICAgIH0KICAgICAgICBteSAkSW47CiAgICAgICAgaWYgKCBvcGVuKCAkSW4sICIkQ29tbWFuZGxpbmUgfCIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICBpZiAoICRfID1+IC9eKC4rPylccy4qXHMoXGRcZFxkfFxkXGR8XGQpJS4rPyQvICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJDIgPiA5MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJENoZWNrIG5lICdGYWlsZWQnICYmICQyID4gODUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiLCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkMVxbJDIlXF0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRJbik7CiAgICAgICAgICAgIGlmICggJENoZWNrIGVxICdGYWlsZWQnICkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiRGlzayBpcyBmdWxsICgkTWVzc2FnZSkuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIkRpc2sgdXNhZ2UgKCRNZXNzYWdlKS4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICREYXRhID0gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRGlzayBVc2FnZScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBkaXNrIHVzYWdlLiIsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gJERhdGE7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PVFJTLnBtIC0gYWxsIHJlcXVpcmVkIG90cnMgaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMiBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9UUlMucG0sdiAxLjQxLjIuMiAyMDEyLzA2LzEyIDIyOjQ4OjU1IGNnIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpPVFJTOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlBhY2thZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6QXV0aDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40MS4yLjIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IEVuY29kZU9iamVjdCBEQk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57U3VwcG9ydE9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntQYWNrYWdlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntBdXRoT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkF1dGgtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5hbWVzIG9mIGF2YWlsYWJsZSBjaGVja3MgZnJvbSBzeXNjb25maWcKICAgIG15ICRDaGVja3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6T1RSUycpOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY2hlY2tzIHNob3VsZCBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBzb3J0IGdyZXAgeyAkQ2hlY2tzLT57JF99IH0ga2V5cyAleyRDaGVja3N9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQEVuYWJsZWRDaGVja0Z1bmN0aW9ucykgewoKICAgICAgICAjIHByZXBlbmQgYW4gdW5kZXJzY29yZQogICAgICAgICRGdW5jdGlvbk5hbWUgPSAnXycgLiAkRnVuY3Rpb25OYW1lOwoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgojIGNoZWNrIGlmIGVycm9yIGxvZyBlbnRyaWVzIGFyZSBhdmFpbGFibGUKc3ViIF9Mb2dDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBUaWNrZXQ6OkluZGV4TW9kdWxlIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdPSyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgbXkgJEVycm9yICAgPSAnJzsKCiAgICBteSBATGluZXMgPSBzcGxpdCggL1xuLywgJFNlbGYtPntMb2dPYmplY3R9LT5HZXRMb2coKSApOwogICAgZm9yIChATGluZXMpIHsKICAgICAgICBteSBAUm93ID0gc3BsaXQoIC87Oy8sICRfICk7CiAgICAgICAgaWYgKCAkUm93WzNdICkgewogICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gL2Vycm9yL2kgKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlID0gJ1lvdSBoYXZlIG1vcmUgZXJyb3IgbG9nIGVudHJpZXM6ICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICdUaGVyZSBpcyBvbmUgZXJyb3IgbG9nIGVudHJ5OiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRFcnJvcikgewogICAgICAgICAgICAgICAgICAgICRFcnJvciAuPSAnLCAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEVycm9yIC49ICRSb3dbM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0xvZ0NoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgbG9nIGZvciBlcnJvciBsb2cgZW50cmllcy4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlIC4gJEVycm9yLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVGlja2V0SW5kZXhNb2R1bGVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBUaWNrZXQ6OkluZGV4TW9kdWxlIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICRNb2R1bGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6SW5kZXhNb2R1bGUnKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIHRpY2tldCcgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID4gODAwMDAgKSB7CiAgICAgICAgICAgIGlmICggJE1vZHVsZSA9fiAvUnVudGltZURCLyApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICIkUm93WzBdIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uIFlvdSBzaG91bGQgdXNlIHRoZSBTdGF0aWNEQiBiYWNrZW5kLiBTZWUgYWRtaW4gbWFudWFsIChQZXJmb3JtYW5jZSBUdW5pbmcpIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJvd1swXSA+IDYwMDAwICkgewogICAgICAgICAgICBpZiAoICRNb2R1bGUgPX4gL1J1bnRpbWVEQi8gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICIkUm93WzBdIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uIFlvdSBzaG91bGQgdXNlIHRoZSBTdGF0aWNEQiBiYWNrZW5kLiBTZWUgYWRtaW4gbWFudWFsIChQZXJmb3JtYW5jZSBUdW5pbmcpIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIllvdSBhcmUgdXNpbmcgXCIkTW9kdWxlXCIsIHRoYXQncyBmaW5lIGZvciAkUm93WzBdIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uIjsKICAgICAgICB9CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnVGlja2V0OjpJbmRleE1vZHVsZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIFRpY2tldDo6SW5kZXhNb2R1bGUgc2V0dGluZy4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVGlja2V0U3RhdGljREJPcnBoYW5lZFJlY29yZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgVGlja2V0OjpJbmRleE1vZHVsZSBjaGVjayBmb3IgcmVjb3JkcyBpbiBTdGF0aWNEQiB3aGVuIHVzaW5nIGRpZmZlcmVudCBiYWNrZW5kCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICRNb2R1bGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6SW5kZXhNb2R1bGUnKTsKCiAgICBpZiAoICRNb2R1bGUgIX4gL1N0YXRpY0RCLyApIHsKCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnU0VMRUNUIGNvdW50KCopIGZyb20gdGlja2V0X2xvY2tfaW5kZXgnICk7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gIiRSb3dbMF0gdGlja2V0cyBpbiBTdGF0aWNEQiBsb2NrX2luZGV4IGJ1dCB5b3UgYXJlIHVzaW5nIHRoZSAkTW9kdWxlIGluZGV4LiBQbGVhc2UgcnVuIG90cnMvYmluL290cnMuQ2xlYW5UaWNrZXRJbmRleC5wbCB0byBjbGVhbiB0aGUgU3RhdGljREIgaW5kZXguIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnU0VMRUNUIGNvdW50KCopIGZyb20gdGlja2V0X2luZGV4JyApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICIkUm93WzBdIHRpY2tldHMgaW4gU3RhdGljREIgaW5kZXggYnV0IHlvdSBhcmUgdXNpbmcgdGhlICRNb2R1bGUgaW5kZXguIFBsZWFzZSBydW4gb3Rycy9iaW4vb3Rycy5DbGVhblRpY2tldEluZGV4LnBsIHRvIGNsZWFuIHRoZSBTdGF0aWNEQiBpbmRleC4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE1lc3NhZ2UgPSAiWW91IGFyZSB1c2luZyAkTW9kdWxlLiBTa2lwcGluZyB0ZXN0LiI7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgfQogICAgaWYgKCAkTWVzc2FnZSBlcSAnJyApIHsKICAgICAgICAkTWVzc2FnZSA9ICdObyBvcnBoYW5lZCByZWNvcmRzIGZvdW5kLic7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgfQoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdUaWNrZXRTdGF0aWNEQk9ycGhhbmVkUmVjb3JkcycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIG9ycGhhbmVkIFN0YXRpY0RCIHJlY29yZHMuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RpY2tldEZ1bGx0ZXh0SW5kZXhNb2R1bGVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyBUaWNrZXQ6OkluZGV4TW9kdWxlIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICRNb2R1bGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VhcmNoSW5kZXhNb2R1bGUnKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIGFydGljbGUnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA+IDEwMDAwMCApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlID1+IC9SdW50aW1lREIvICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gIiRSb3dbMF0gYXJ0aWNsZXMgaW4geW91ciBzeXN0ZW0uIFlvdSBzaG91bGQgdXNlIHRoZSBTdGF0aWNEQiBiYWNrZW5kIGZvciBPVFJTIDIuMyBhbmQgaGlnaGVyLiBTZWUgYWRtaW4gbWFudWFsIChQZXJmb3JtYW5jZSBUdW5pbmcpIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJvd1swXSA+IDUwMDAwICkgewogICAgICAgICAgICBpZiAoICRNb2R1bGUgPX4gL1J1bnRpbWVEQi8gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICIkUm93WzBdIGFydGljbGVzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZCBmb3IgT1RSUyAyLjMgYW5kIGhpZ2hlci4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgID0gIllvdSBhcmUgdXNpbmcgXCIkTW9kdWxlXCIsIHRoYXQncyBmaW5lIGZvciAkUm93WzBdIGFydGljbGVzIGluIHlvdXIgc3lzdGVtLiI7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RpY2tldDo6U2VhcmNoSW5kZXhNb2R1bGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlIHNldHRpbmcuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgojIE9wZW5UaWNrZXRDaGVjayBjaGVjawpzdWIgX09wZW5UaWNrZXRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgICA9ICcnOwogICAgbXkgQFRpY2tldElEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICAgICBTdGF0ZVR5cGUgID0+ICdPcGVuJywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgIExpbWl0ICAgICAgPT4gODk5OTksCiAgICApOwogICAgaWYgKCAkI1RpY2tldElEcyA+IDg5OTkwICkgewogICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1lvdSBzaG91bGQgbm90IGhhdmUgbW9yZSB0aGFuIDgwMDAgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3UgY3VycmVudGx5IGhhdmUgb3ZlciA4OTk5OSEgSW4gY2FzZSB5b3Ugd2FudCB0byBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UsIGNsb3NlIG5vdCBuZWVkZWQgb3BlbiB0aWNrZXRzLic7CgogICAgfQogICAgZWxzaWYgKCAkI1RpY2tldElEcyA+IDEwMDAwICkgewogICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1lvdSBzaG91bGQgbm90IGhhdmUgb3ZlciA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlICcKICAgICAgICAgICAgLiAkI1RpY2tldElEcwogICAgICAgICAgICAuICcuIEluIGNhc2UgeW91IHdhbnQgdG8gaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlLCBjbG9zZSBub3QgbmVlZGVkIG9wZW4gdGlja2V0cy4nOwoKICAgIH0KICAgIGVsc2lmICggJCNUaWNrZXRJRHMgPiA4MDAwICkgewogICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgPSAnWW91IHNob3VsZCBub3QgaGF2ZSBtb3JlIHRoYW4gODAwMCBvcGVuIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uIFlvdSBjdXJyZW50bHkgaGF2ZSAnCiAgICAgICAgICAgIC4gJCNUaWNrZXRJRHMKICAgICAgICAgICAgLiAnLiBJbiBjYXNlIHlvdSB3YW50IHRvIGltcHJvdmUgeW91ciBwZXJmb3JtYW5jZSwgY2xvc2Ugbm90IG5lZWRlZCBvcGVuIHRpY2tldHMuJzsKCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAnWW91IGhhdmUgJyAuICQjVGlja2V0SURzIC4gJyBvcGVuIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uJzsKICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdPcGVuVGlja2V0Q2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBvcGVuIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgojIENoZWNrIGlmIHRoZSBjb25maWd1cmVkIEZRRE4gaXMgdmFsaWQuCnN1YiBfRlFETkNvbmZpZ0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnRlFETkNvbmZpZ0NoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyZWQgRlFETiBpcyB2YWxpZC4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgIENvbW1lbnQgICAgID0+ICcnLAogICAgfTsKCiAgICAjIEdldCB0aGUgY29uZmlndXJlZCBGUUROCiAgICBteSAkRlFETiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJyk7CgogICAgIyBEbyB3ZSBoYXZlIHNldCBvdXIgRlFETj8KICAgIGlmICggJEZRRE4gZXEgJ3lvdXJob3N0LmV4YW1wbGUuY29tJyApIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSA9ICdGYWlsZWQnOwogICAgICAgICREYXRhLT57Q29tbWVudH0KICAgICAgICAgICAgPSAiUGxlYXNlIGNvbmZpZ3VyZSB5b3VyIEZRRE4gaW5zaWRlIHRoZSBTeXNDb25maWcgbW9kdWxlLiAoY3VycmVudGx5IHRoZSBkZWZhdWx0IHNldHRpbmcgJyRGUUROJyBpcyBlbmFibGVkKS4iOwogICAgfQoKICAgICMgRlFETiBzeW50YXggY2hlY2suCiAgICBlbHNpZiAoICRGUUROICF+IC9eKFthLXpBLVowLTldKFthLXpBLVowLTlcLV17MCw2MX1bYS16QS1aMC05XSk/XC4pK1thLXpBLVpdezIsNn0kLyApIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ0ZhaWxlZCc7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJJbnZhbGlkIEZRRE4gJyRGUUROJy4iOwogICAgfQoKICAgICMgTm90aGluZyB0byBjb21wbGFpbi4gOi0oCiAgICBlbHNlIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ09LJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIkZRRE4gJyRGUUROJyBsb29rcyBnb29kLiI7CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCiMgQ2hlY2sgaWYgdGhlIFN5c3RlbUlEIGNvbnRhaW5zIG9ubHkgZGlnaXRzLgpzdWIgX1N5c3RlbUlEQ29uZmlnQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnU3lzdGVtSURDb25maWdDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIHRoZSBjb25maWd1cmVkIFN5c3RlbUlEIGNvbnRhaW5zIG9ubHkgZGlnaXRzLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJycsCiAgICB9OwoKICAgICMgR2V0IHRoZSBjb25maWd1cmVkIFN5c3RlbUlECiAgICBteSAkU3lzdGVtSUQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3lzdGVtSUQnKTsKCiAgICAjIERvZXMgdGhlIFN5c3RlbUlEIGNvbnRhaW4gbm9uLWRpZ2l0cz8KICAgIGlmICggJFN5c3RlbUlEID1+IC9eXGQrJC8gKSB7CiAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdPSyc7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICIgWW91ciBTeXN0ZW1JRCBzZXR0aW5nIGlzICRTeXN0ZW1JRC4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIlRoZSBTeXN0ZW1JRCAnJFN5c3RlbUlEJyBtdXN0IGNvbnNpc3Qgb2YgZGlnaXRzIGV4Y2x1c2l2ZWx5LiI7CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCiMgQ2hlY2sgaWYgVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQgaXMgdmFsaWQKc3ViIF9Db25maWdDaGVja1RpY2tldEZyb250ZW5kUmVzcG9uc2VGb3JtYXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnUmVzcG9uc2VGb3JtYXRDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIFRpY2tldDo6RnJvbnRlbmQ6OlJlc3BvbnNlRm9ybWF0IGNvbnRhaW5zIG5vICREYXRheyIifS4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgIENvbW1lbnQgICAgID0+ICcnLAogICAgfTsKCiAgICAjIEdldCB0aGUgY29uZmlnCiAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlJlc3BvbnNlRm9ybWF0Jyk7CgogICAgIyBEb2VzIHRoZSBTeXN0ZW1JRCBjb250YWluIG5vbi1kaWdpdHM/CiAgICBpZiAoICRDb25maWcgIX4gL1wkRGF0YXsiLyApIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ09LJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIiBObyBcJERhdGF7XCJcIn0gZm91bmQuIgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEtPntDb21tZW50fQogICAgICAgICAgICA9ICJDb25maWcgb3B0aW9uIFRpY2tldDo6RnJvbnRlbmQ6OlJlc3BvbnNlRm9ybWF0IGNvaW50YWlucyBcJERhdGF7XCJcIn0sIHVzZSBcJFFEYXRhe1wiXCJ9IGluc3RhbmQgKHNlZWQgZGVmYXVsdCBzZXR0aW5nKS4iOwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0ZpbGVTeXN0ZW1DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkRGF0YSAgICA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnRmlsZVN5c3RlbUNoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgZmlsZSBzeXN0ZW0gaXMgd3JpdGFibGUuJywKICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICBDb21tZW50ICAgICA9PiAnVGhlIGZpbGUgc3lzdGVtIGlzIHdyaXRhYmxlLicsCiAgICB9OwoKICAgIG15ICRIb21lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKCiAgICAjIGNoZWNrIEhvbWUKICAgIGlmICggIS1lICRIb21lICkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnRmFpbGVkJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIk5vIHN1Y2ggaG9tZSBkaXJlY3Rvcnk6ICRIb21lISIsCiAgICAgICAgICAgIHJldHVybiAkRGF0YTsKICAgIH0KICAgIGZvciAoCiAgICAgICAgcXcoL2Jpbi8gL0tlcm5lbC8gL0tlcm5lbC9TeXN0ZW0vIC9LZXJuZWwvT3V0cHV0LyAvS2VybmVsL091dHB1dC9IVE1MLyAvS2VybmVsL01vZHVsZXMvKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkRmlsZSA9ICIkSG9tZS8kXy9jaGVja19wZXJtaXNzb25zLiQkIjsKICAgICAgICBpZiAoIG9wZW4oIG15ICRGSUxFLCAnPicsICIkRmlsZSIgKSApIHsKICAgICAgICAgICAgcHJpbnQgJEZJTEUgInRlc3QiOwogICAgICAgICAgICBjbG9zZSgkRklMRSk7CiAgICAgICAgICAgIHVubGluayAkRmlsZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlIC49ICIkRmlsZSgkISk7IjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJDYW4ndCB3cml0ZSBmaWxlOiAkTWVzc2FnZSIsCiAgICAgICAgICAgIHJldHVybiAkRGF0YTsKICAgIH0KCiAgICAkRGF0YS0+e0NoZWNrfSA9ICdPSyc7CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1BhY2thZ2VEZXBsb3lDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdQYWNrYWdlRGVwbG95Q2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBkZXBsb3ltZW50IG9mIGFsbCBwYWNrYWdlcy4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJ0FsbCBwYWNrYWdlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZC4nLAogICAgfTsKCiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgZm9yIG15ICRQYWNrYWdlICggJFNlbGYtPntQYWNrYWdlT2JqZWN0fS0+UmVwb3NpdG9yeUxpc3QoKSApIHsKICAgICAgICBteSAkRGVwbG95Q2hlY2sgPSAkU2VsZi0+e1BhY2thZ2VPYmplY3R9LT5EZXBsb3lDaGVjaygKICAgICAgICAgICAgTmFtZSAgICA9PiAkUGFja2FnZS0+e05hbWV9LT57Q29udGVudH0sCiAgICAgICAgICAgIFZlcnNpb24gPT4gJFBhY2thZ2UtPntWZXJzaW9ufS0+e0NvbnRlbnR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJERlcGxveUNoZWNrICkgewogICAgICAgICAgICAkTWVzc2FnZSAuPSAkUGFja2FnZS0+e05hbWV9LT57Q29udGVudH0gLiAnICcgLiAkUGFja2FnZS0+e1ZlcnNpb259LT57Q29udGVudH0gLiAnOyAnOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ0NyaXRpY2FsJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIlBhY2thZ2VzIG5vdCBjb3JyZWN0bHkgaW5zdGFsbGVkOiAkTWVzc2FnZS4iLAogICAgfQoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9JbnZhbGlkVXNlckxvY2tlZFRpY2tldFNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IHRoZSBkZWZhdWx0IG1lc3NhZ2UKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdJbnZhbGlkVXNlckxvY2tlZFRpY2tldFNlYXJjaCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgaW52YWxpZCB1c2VyIHdpdGggbG9ja2VkIHRpY2tldHMuJywKICAgICAgICBDaGVjayAgICAgICA9PiAnT0snLAogICAgICAgIENvbW1lbnQgICAgID0+ICdUaGVyZSBhcmUgbm8gaW52YWxpZCB1c2VycyB3aXRoIGxvY2tlZCB0aWNrZXRzLicsCiAgICB9OwoKICAgICMgZ2V0IGFsbCB1c2VycyAoYmVjYXVzZSB0aGVyZSBpcyBubyBmdW5jdGlvbiB0byBnZXQgYWxsIGludmFsaWQgdXNlcnMpCiAgICBteSAlVXNlckxpc3QgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMAogICAgKTsKCiAgICAjIGNyZWF0ZSB0aGUgbGlzdCBvZiBpbnZhbGlkIHVzZXJzCiAgICBteSBASW52YWxpZFVzZXIgPSAoKTsKICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVVc2VyTGlzdCApIHsKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRVc2Vye1ZhbGlkSUR9ID09IDIgKSB7CiAgICAgICAgICAgIHB1c2ggQEludmFsaWRVc2VyLCAkVXNlcklEOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJERhdGEgaWYgIUBJbnZhbGlkVXNlcjsKCiAgICBteSBAVGlja2V0SURzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgUmVzdWx0ICAgPT4gJ0FSUkFZJywKICAgICAgICBMb2NrSURzICA9PiBbMl0sCiAgICAgICAgT3duZXJJRHMgPT4gXEBJbnZhbGlkVXNlciwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJERhdGEgaWYgIUBUaWNrZXRJRHM7CgogICAgbXkgJUxvY2tlZFRpY2tldFVzZXIgPSAoKTsKICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRJRHMpIHsKICAgICAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRMb2NrZWRUaWNrZXRVc2VyeyAkVGlja2V0e093bmVySUR9IH0gPSAkVXNlckxpc3R7ICRUaWNrZXR7T3duZXJJRH0gfTsKICAgIH0KCiAgICBteSAkVXNlclN0cmluZyA9IGpvaW4gJywgJywgdmFsdWVzICVMb2NrZWRUaWNrZXRVc2VyOwogICAgJERhdGEtPntDb21tZW50fSAgID0gIlRoZXNlIGludmFsaWQgdXNlcnMgaGF2ZSBsb2NrZWQgdGlja2V0czogJFVzZXJTdHJpbmciLAogICAgICAgICREYXRhLT57Q2hlY2t9ID0gJ0NyaXRpY2FsJzsKCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfRGVmYXVsdFVzZXJDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IHRoZSBkZWZhdWx0IG1lc3NhZ2UKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdEZWZhdWx0VXNlckNoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgcm9vdEBsb2NhbGhvc3QgYWNjb3VudCBoYXMgdGhlIGRlZmF1bHQgcGFzc3dvcmQuJywKICAgICAgICBDaGVjayAgICAgICA9PiAnT0snLAogICAgICAgIENvbW1lbnQgICAgID0+ICdUaGVyZSBpcyBubyBhY3RpdmUgcm9vdEBsb2NhbGhvc3Qgd2l0aCBkZWZhdWx0IHBhc3N3b3JkLicsCiAgICB9OwoKICAgICMgcmV0cmlldmUgbGlzdCBvZiB2YWxpZCB1c2VycwogICAgbXkgJVVzZXJMaXN0ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ1Nob3J0JywKICAgICAgICBWYWxpZCA9PiAnMScsCiAgICApOwoKICAgIG15ICRTdXBlclVzZXJJRDsKICAgIFVTRVI6CiAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlVXNlckxpc3QgKSB7CiAgICAgICAgaWYgKCAkVXNlckxpc3R7JFVzZXJJRH0gZXEgJ3Jvb3RAbG9jYWxob3N0JyApIHsKICAgICAgICAgICAgJFN1cGVyVXNlcklEID0gMTsKICAgICAgICAgICAgbGFzdCBVU0VSOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkRGF0YSBpZiAhJFN1cGVyVXNlcklEOwoKICAgICMgc2VlIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCBwYXNzd29yZCBhdHRhY2hlZAogICAgbXkgJERlZmF1bHRQYXNzID0gJFNlbGYtPntBdXRoT2JqZWN0fS0+QXV0aCgKICAgICAgICBVc2VyID0+ICdyb290QGxvY2FsaG9zdCcsCiAgICAgICAgUHcgICA9PiAncm9vdCcsCiAgICApOwogICAgcmV0dXJuICREYXRhIGlmICEkRGVmYXVsdFBhc3M7CgogICAgJERhdGEtPntDb21tZW50fSA9ICJDaGFuZ2UgdGhlIHBhc3N3b3JkIG9yIGludmFsaWRhdGUgdGhlIGFjY291bnQgJ3Jvb3RcQGxvY2FsaG9zdCcuIjsKICAgICREYXRhLT57Q2hlY2t9ICAgPSAnQ3JpdGljYWwnOwoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9EZWZhdWx0U09BUFVzZXJDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdTT0FQQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBkZWZhdWx0IFNPQVAgY3JlZGVudGlhbHMuJywKICAgICAgICBDb21tZW50ICAgICA9PiAnWW91IGhhdmUgbm90IGVuYWJsZWQgU09BUCBvciBoYXZlIHNldCB5b3VyIG93biBwYXNzd29yZC4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICB9OwoKICAgIG15ICRTT0FQVXNlciAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU09BUDo6VXNlcicpICAgICB8fCAnJzsKICAgIG15ICRTT0FQUGFzc3dvcmQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU09BUDo6UGFzc3dvcmQnKSB8fCAnJzsKCiAgICBpZiAoICRTT0FQVXNlciBlcSAnc29tZV91c2VyJyApIHsKICAgICAgICBpZiAoICRTT0FQUGFzc3dvcmQgZXEgJ3NvbWVfcGFzcycgfHwgJFNPQVBQYXNzd29yZCBlcSAnJyApIHsKICAgICAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICREYXRhLT57Q29tbWVudH0gPSAnUGxlYXNlIHNldCBhIHN0cm9uZyBwYXNzd29yZCBmb3IgU09BUDo6UGFzc3dvcmQgaW4gU3lzQ29uZmlnLic7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgojIEdlbmVyYWwgU3lzdGVtIE92ZXJ2aWV3CnN1YiBfR2VuZXJhbFN5c3RlbU92ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgICAgICA9IHt9OwogICAgbXkgJFRhYmxlSW5mbyA9ICcnOwogICAgbXkgJENvdW50ZXIgICA9IDA7CgogICAgbXkgJENoZWNrID0gJ09LJzsKCiAgICAkVGFibGVJbmZvIC49ICdQcm9kdWN0PScgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdCcpIC4KICAgICAgICAnICcgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVmVyc2lvbicpIC4gJzsnOwogICAgbXkgJVNlYXJjaCA9ICgKICAgICAgICAxID0+IHsKICAgICAgICAgICAgVGFibGVOYW1lICAgPT4gJ3RpY2tldCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdUaWNrZXRzJywKICAgICAgICB9LAogICAgICAgIDIgPT4gewogICAgICAgICAgICBUYWJsZU5hbWUgICA9PiAnYXJ0aWNsZScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdBcnRpY2xlcycsCiAgICAgICAgfSwKICAgICAgICAzID0+IHsKICAgICAgICAgICAgVGFibGVOYW1lICAgPT4gJ3VzZXJzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0FnZW50cycsCiAgICAgICAgfSwKICAgICAgICA0ID0+IHsKICAgICAgICAgICAgVGFibGVOYW1lICAgPT4gJ3JvbGVzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1JvbGVzJywKICAgICAgICB9LAogICAgICAgIDUgPT4gewogICAgICAgICAgICBUYWJsZU5hbWUgICA9PiAnZ3JvdXBzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkdyb3VwcyIsCiAgICAgICAgfSwKICAgICk7CgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVNlYXJjaCApIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdTRUxFQ1QgY291bnQoKikgZnJvbSAnIC4gJFNlYXJjaHskS2V5fS0+e1RhYmxlTmFtZX0gKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkU2VhcmNoeyRLZXl9LT57UmVzdWx0fSA9ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgICRUYWJsZUluZm8gLj0gIiRTZWFyY2h7JEtleX0tPntEZXNjcmlwdGlvbn09JFNlYXJjaHskS2V5fS0+e1Jlc3VsdH07IjsKICAgIH0KCiAgICAjIG9ubHkgY2FsY3VsYXRlIGF2ZXJhZ2UgaWYgd2UgYWN0dWFsbHkgaGF2ZSB0aWNrZXRzCiAgICBpZiAoICRTZWFyY2h7MX0tPntSZXN1bHR9ICYmICRTZWFyY2h7Mn0tPntSZXN1bHR9ICkgewogICAgICAgIG15ICRBdmdBcnRpY2xlc1RpY2tldCA9ICRTZWFyY2h7Mn0tPntSZXN1bHR9IC8gJFNlYXJjaHsxfS0+e1Jlc3VsdH07CiAgICAgICAgJEF2Z0FydGljbGVzVGlja2V0ID0gc3ByaW50ZiggIiUuMmYiLCAkQXZnQXJ0aWNsZXNUaWNrZXQgKTsKICAgICAgICAkVGFibGVJbmZvIC49ICJBcnRpY2xlcyBwZXIgdGlja2V0IChhdmcpPSRBdmdBcnRpY2xlc1RpY2tldDsiOwogICAgfQoKICAgICMgIHRpY2tldHMgcGVyIG1vbnRoIChhdmcpCiAgICBteSAkTW9udGhJblNlY29uZHMgPSAyNjI2NTYwOyAgICAjIDYwICogNjAgKiAyNCAqIDMwLjQ7CiAgICBteSAkVGlja2V0V2luZG93VGltZTsgICAgICAgICAgICAjIGluIG1vbnRocwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJzZWxlY3QgbWF4KGNyZWF0ZV90aW1lX3VuaXgpLCBtaW4oY3JlYXRlX3RpbWVfdW5peCkgIiAuCiAgICAgICAgICAgICJmcm9tIHRpY2tldCB3aGVyZSBpZCA+IDEgIiwKICAgICk7CiAgICBteSAkVGlja2V0Q3JlYXRlVGltZU1heDsKICAgIG15ICRUaWNrZXRDcmVhdGVUaW1lTWluOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBtb250aHMgb24gc2Vjb25kcwogICAgICAgICRUaWNrZXRDcmVhdGVUaW1lTWF4ID0gJFJvd1swXSB8fCAwOwogICAgICAgICRUaWNrZXRDcmVhdGVUaW1lTWluID0gJFJvd1sxXSB8fCAwOwogICAgfQogICAgJFRpY2tldFdpbmRvd1RpbWUgPSAoICRUaWNrZXRDcmVhdGVUaW1lTWF4IC0gJFRpY2tldENyZWF0ZVRpbWVNaW4gKSB8fCAxOwogICAgJFRpY2tldFdpbmRvd1RpbWUgPSAkVGlja2V0V2luZG93VGltZSAvICRNb250aEluU2Vjb25kczsKICAgICRUaWNrZXRXaW5kb3dUaW1lID0gMQogICAgICAgIGlmICRUaWNrZXRXaW5kb3dUaW1lIDwgMTsKICAgIG15ICRBdmVyYWdlVGlja2V0c01vbnRoID0gJFNlYXJjaHsxfS0+e1Jlc3VsdH0gLyAkVGlja2V0V2luZG93VGltZTsKICAgICRBdmVyYWdlVGlja2V0c01vbnRoID0gc3ByaW50ZiggIiUuMmYiLCAkQXZlcmFnZVRpY2tldHNNb250aCApOwogICAgJFRpY2tldFdpbmRvd1RpbWUgICAgPSBzcHJpbnRmKCAiJS4yZiIsICRUaWNrZXRXaW5kb3dUaW1lICk7CiAgICAkVGFibGVJbmZvIC49ICJNb250aHMgYmV0d2VlbiBmaXJzdCBhbmQgbGFzdCB0aWNrZXQ9JFRpY2tldFdpbmRvd1RpbWU7IjsKICAgICRUYWJsZUluZm8gLj0gIlRpY2tldHMgcGVyIG1vbnRoIChhdmcpPSRBdmVyYWdlVGlja2V0c01vbnRoOyI7CgogICAgIyAgYXR0YWNobWVudHMKICAgIG15ICRTdG9yYWdlTW9kdWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U3RvcmFnZU1vZHVsZScpIHx8ICcnOwoKICAgIGlmICggJFN0b3JhZ2VNb2R1bGUgZXEgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGVTdG9yYWdlREInICkgewogICAgICAgIG15ICRIb3dNYW55QXR0YWNobWVudHM7CiAgICAgICAgbXkgJEF2ZXJhZ2VBdHRhY2htZW50U2l6ZSA9IDA7CiAgICAgICAgbXkgJEF2Z0F0dGFjaG1lbnRUaWNrZXQgICA9IDA7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAic2VsZWN0IGlkLCBjb250ZW50X3NpemUgZnJvbSBhcnRpY2xlX2F0dGFjaG1lbnQgIiAuCiAgICAgICAgICAgICAgICAid2hlcmUgY29udGVudF90eXBlIG5vdCBsaWtlKCd0ZXh0L2h0bWwlJykiLAogICAgICAgICk7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEhvd01hbnlBdHRhY2htZW50cysrOwogICAgICAgICAgICAkQXZlcmFnZUF0dGFjaG1lbnRTaXplID0gJEF2ZXJhZ2VBdHRhY2htZW50U2l6ZSArICRSb3dbMV07CiAgICAgICAgfQoKICAgICAgICBpZiAoJEhvd01hbnlBdHRhY2htZW50cykgewogICAgICAgICAgICAkQXZlcmFnZUF0dGFjaG1lbnRTaXplID0gJEF2ZXJhZ2VBdHRhY2htZW50U2l6ZSAvICRIb3dNYW55QXR0YWNobWVudHM7CiAgICAgICAgICAgICRBdmVyYWdlQXR0YWNobWVudFNpemUgPSBpbnQoICRBdmVyYWdlQXR0YWNobWVudFNpemUgLyAxMDI0ICk7CiAgICAgICAgICAgICRBdmVyYWdlQXR0YWNobWVudFNpemUgPSBzcHJpbnRmKCAiJS4yZiIsICRBdmVyYWdlQXR0YWNobWVudFNpemUgKTsKICAgICAgICAgICAgJEF2Z0F0dGFjaG1lbnRUaWNrZXQgICA9ICRIb3dNYW55QXR0YWNobWVudHMgLyAkU2VhcmNoezF9LT57UmVzdWx0fTsKICAgICAgICAgICAgJEF2Z0F0dGFjaG1lbnRUaWNrZXQgICA9IHNwcmludGYoICIlLjJmIiwgJEF2Z0F0dGFjaG1lbnRUaWNrZXQgKTsKICAgICAgICB9CgogICAgICAgICRUYWJsZUluZm8gLj0gIkF0dGFjaG1lbnRzIHBlciB0aWNrZXQgKGF2Zyk9JEF2Z0F0dGFjaG1lbnRUaWNrZXQ7IjsKICAgICAgICAkVGFibGVJbmZvIC49ICJBdHRhY2htZW50IHNpemUgKGF2Zyk9JEF2ZXJhZ2VBdHRhY2htZW50U2l6ZSBLQjsiOwogICAgfQoKICAgICMgY3VzdG9tZXJzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gInNlbGVjdCBDT1VOVChESVNUSU5DVChjdXN0b21lcl91c2VyX2lkKSkgIiAuCiAgICAgICAgICAgICJmcm9tIHRpY2tldCIsCiAgICApOwogICAgbXkgJEN1c3RvbWVyczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgbW9udGhzIG9uIHNlY29uZHMKICAgICAgICAkQ3VzdG9tZXJzID0gJFJvd1swXSB8fCAwOwogICAgfQogICAgJFRhYmxlSW5mbyAuPSAiQ3VzdG9tZXJzIHdpdGggYXQgbGVhc3Qgb25lIHRpY2tldD0kQ3VzdG9tZXJzOyI7CgogICAgIyBvcGVyYXRpbmcgc3lzdGVtCiAgICAkVGFibGVJbmZvIC49ICJPcGVyYXRpbmcgc3lzdGVtPSReTzsiOwoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdHZW5lcmFsU3lzdGVtT3ZlcnZpZXcnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdEaXNwbGF5IGEgZ2VuZXJhbCBzeXN0ZW0gb3ZlcnZpZXcnLAogICAgICAgIENvbW1lbnQgICAgID0+ICdHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHlvdXIgc3lzdGVtLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIEJsb2NrU3R5bGUgID0+ICdUYWJsZURhdGFTaW1wbGUnLAogICAgICAgIFRhYmxlSW5mbyAgID0+ICRUYWJsZUluZm8sCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvSUlTLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSUlTLnBtLHYgMS45IDIwMTAvMDIvMDkgMjE6Mjk6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6SUlTOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OldlYnNlcnZlcjo6SUlTJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfUGVybEV4Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgY2hlY2sgaWYgQXBhY2hlOjpEQkkgaXMgbG9hZGVkCiAgICBteSAkQ2hlY2sgICA9ICcnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIGlmICggJEVOVnsnR0FURVdBWV9JTlRFUkZBQ0UnfSAmJiAkRU5WeydHQVRFV0FZX0lOVEVSRkFDRSd9ID1+IC9eQ0dJLVBlcmxFeC9pICkgewogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAkTWVzc2FnZSA9ICJQZXJsRXggaXMgaW4gdXNlICgkRU5WeydHQVRFV0FZX0lOVEVSRkFDRSd9KS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICdZb3Ugc2hvdWxkIHVzZSBQZXJsRXggdG8gaW5jcmVhc2UgeW91ciBwZXJmb3JtYW5jZS4nOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BlcmxFeCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIFBlcmxFeCBpcyB1c2VkLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvQXBhY2hlLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQXBhY2hlLnBtLHYgMS4xNCAyMDEwLzAyLzA5IDIxOjI5OjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXI6OkFwYWNoZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5hbWVzIG9mIGF2YWlsYWJsZSBjaGVja3MgZnJvbSBzeXNjb25maWcKICAgIG15ICRDaGVja3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6V2Vic2VydmVyOjpBcGFjaGUnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gc29ydCBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9BcGFjaGVWZXJzaW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSAgICA9IHt9OwogICAgbXkgJENoZWNrICAgPSAnJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBpZiAoICRFTlZ7U0VSVkVSX1NPRlRXQVJFfSApIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAiWW91IGFyZSBydW5uaW5nICRFTlZ7U0VSVkVSX1NPRlRXQVJFfS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICdDb3VsZCBub3QgZGV0ZXJtaW5lIEFwYWNoZSB2ZXJzaW9uLic7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQXBhY2hlIFZlcnNpb24nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdEaXNwbGF5IHdlYiBzZXJ2ZXIgdmVyc2lvbi4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQXBhY2hlREJJQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgY2hlY2sgaWYgQXBhY2hlOjpEQkkgaXMgbG9hZGVkCiAgICBteSAkQXBhY2hlREJJID0gMDsKICAgIG15ICRDaGVjayAgICAgPSAnJzsKICAgIG15ICRNZXNzYWdlICAgPSAnJzsKICAgIGlmICggJEVOVntNT0RfUEVSTH0gKSB7CiAgICAgICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICVJTkMgKSB7CiAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLy86Oi9nOwogICAgICAgICAgICAkTW9kdWxlID1+IHMvXC5wbSQvL2c7CiAgICAgICAgICAgIGlmICggJE1vZHVsZSBlcSAnQXBhY2hlOjpEQkknIHx8ICRNb2R1bGUgZXEgJ0FwYWNoZTI6OkRCSScgKSB7CiAgICAgICAgICAgICAgICAkQXBhY2hlREJJID0gJE1vZHVsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICEkQXBhY2hlREJJICkgewogICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAnQXBhY2hlOjpEQkkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGEgYmV0dGVyIHBlcmZvcm1hbmNlIChwcmUtZXN0YWJsaXNoIGRhdGFiYXNlIGNvbm5lY3Rpb25zKS4nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICRBcGFjaGVEQkk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgSnVzdCBza2lwIHRoaXMgdGVzdCBpZiB3ZScgcmUgbm90IHJ1bm5pbmcgbW9kX3BlcmwuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FwYWNoZTo6REJJJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIHN5c3RlbSB1c2VzIEFwYWNoZTo6REJJLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9BcGFjaGVSZWxvYWRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyByZWxvYWQgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgaWYgKCAkRU5We01PRF9QRVJMfSApIHsKICAgICAgICBldmFsICJyZXF1aXJlIG1vZF9wZXJsIjsKICAgICAgICBpZiAoIGRlZmluZWQgJG1vZF9wZXJsOjpWRVJTSU9OICkgewogICAgICAgICAgICBpZiAoICRtb2RfcGVybDo6VkVSU0lPTiA+PSAxLjk5ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgQXBhY2hlOjpSZWxvYWQgaXMgbG9hZGVkCiAgICAgICAgICAgICAgICBteSAkQXBhY2hlUmVsb2FkID0gMDsKICAgICAgICAgICAgICAgIGZvciBteSAkTW9kdWxlICgga2V5cyAlSU5DICkgewogICAgICAgICAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLy86Oi9nOwogICAgICAgICAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLnBtJC8vZzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRNb2R1bGUgZXEgJ0FwYWNoZTo6UmVsb2FkJyB8fCAkTW9kdWxlIGVxICdBcGFjaGUyOjpSZWxvYWQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXBhY2hlUmVsb2FkID0gJE1vZHVsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkQXBhY2hlUmVsb2FkICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayA9ICdJbmZvJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICA9ICdBcGFjaGU6OlJlbG9hZCBvciBBcGFjaGUyOjpSZWxvYWQgc2hvdWxkIGJlIHVzZWQgYXMgUGVybE1vZHVsZSBhbmQgUGVybEluaXRIYW5kbGVyIHRvIHByZXZlbnQgd2ViIHNlcnZlciByZXN0YXJ0cyB3aGVuIGluc3RhbGxpbmcgYW5kIHVwZ3JhZGluZyBtb2R1bGVzLic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkQXBhY2hlUmVsb2FkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgSnVzdCBza2lwIHRoaXMgdGVzdCBpZiB3ZScgcmUgbm90IHJ1bm5pbmcgbW9kX3BlcmwuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FwYWNoZTo6UmVsb2FkJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIHN5c3RlbSB1c2VzIEFwYWNoZTo6UmVsb2FkL0FwYWNoZTI6OlJlbG9hZC4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQ0dJQWNjZWxlcmF0b3JDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ICkgewoKICAgICAgICAjIGNoZWNrIG1vZF9wZXJsIHZlcnNpb24KICAgICAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ID1+IC9cLzEuOTkvICkgewogICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiWW91IHVzZSBhIGJldGEgdmVyc2lvbiBvZiBtb2RfcGVybCAoJEVOVntNT0RfUEVSTH0pLCB5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gYSBzdGFibGUgdmVyc2lvbi4iOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRFTlZ7TU9EX1BFUkx9ID1+IC9cLzEvICkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIllvdSBzaG91bGQgdXBkYXRlIG1vZF9wZXJsIHRvIDIueCAoJEVOVntNT0RfUEVSTH0pLiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJEVOVntNT0RfUEVSTH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gPX4gL2Zhc3RjZ2kvaSApIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAnWW91IGFyZSB1c2luZyBGYXN0Q0dJLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgJE1lc3NhZ2UgPSAnWW91IHNob3VsZCB1c2UgRmFzdENHSSBvciBtb2RfcGVybCB0byBpbmNyZWFzZSB5b3VyIHBlcmZvcm1hbmNlLic7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQ0dJIEFjY2VsZXJhdG9yJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZm9yIENHSSBBY2NlbGVyYXRvci4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9vcmFjbGUucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBvcmFjbGUucG0sdiAxLjIyIDIwMTAvMDUvMjggMDc6MjM6MjggbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjpvcmFjbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIyICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6T3JhY2xlJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfT3JhY2xlSG9tZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIGNoZWNrIE9SQUNMRV9IT01FCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gT1JBQ0xFX0hPTUUgc2V0dGluZyBmb3VuZC4nOwogICAgaWYgKCAkRU5We09SQUNMRV9IT01FfSApIHsKICAgICAgICBpZiAoICEtZSAkRU5We09SQUNMRV9IT01FfSApIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiT1JBQ0xFX0hPTUUgZG9uJ3QgZXhpc3RzICgkRU5We09SQUNMRV9IT01FfSkuIjsKICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIllvdXIgT1JBQ0xFX0hvbWUgY29uZmlndXJhdGlvbiBpcyAkRU5We09SQUNMRV9IT01FfS4iOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ09SQUNMRV9IT01FJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgT1JBQ0xFX0hPTUUgY29uZmlndXJhdGlvbi4iLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfTkxTTGFuZ0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBOTFNfTEFORwogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIE5MU19MQU5HIGNvbmZpZ3VyYXRpb24gZm91bmQuJzsKICAgIGlmICggJEVOVntOTFNfTEFOR30gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgICAgICBpZiAoICRFTlZ7TkxTX0xBTkd9ICF+IC91dGYoXC04fDgpLyApIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TkxTX0xBTkd9LCBuZWVkIC51dGY4IGluIE5MU19MQU5HIChlLiBnLiBnZXJtYW5fZ2VybWFueS51dGY4KS4iOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIllvdXIgTkxTX0xBTkcgY29uZmlndXJhdGlvbiBpcyAkRU5We05MU19MQU5HfS4iOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3VyIE5MU19MQU5HIGNvbmZpZ3VyYXRpb24gaXMgJEVOVntOTFNfTEFOR30iOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05MU19MQU5HJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgTkxTX0xBTkcuIiwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX05MU0RhdGVGb3JtYXRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgTkxTX0RBVEVfRk9STUFUCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gTkxTX0RBVEVfRk9STUFUIHNldHRpbmcgZm91bmQuJzsKICAgIGlmICggJEVOVntOTFNfREFURV9GT1JNQVR9ICkgewogICAgICAgIGlmICggJEVOVntOTFNfREFURV9GT1JNQVR9IG5lICJZWVlZLU1NLUREIEhIMjQ6TUk6U1MiICkgewogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiTmVlZCBmb3JtYXQgJ1lZWVktTU0tREQgSEgyNDpNSTpTUycgZm9yIE5MU19EQVRFX0ZPUk1BVCAobm90ICRFTlZ7TkxTX0RBVEVfRk9STUFUfSkuIjsKICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3VyIE5MU19EQVRFX0ZPUk1BVCBzZXR0aW5nIGlzICRFTlZ7TkxTX0RBVEVfRk9STUFUfS4iOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05MU19EQVRFX0ZPUk1BVCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIE5MU19EQVRFX0ZPUk1BVC4iLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfTkxTRGF0ZUZvcm1hdFNlbGVjdENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBOTFNfREFURV9GT1JNQVQKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdOTFNfREFURV9GT1JNQVQgc2VlbXMgdG8gYmUgd3JvbmcnOwogICAgbXkgJENyZWF0ZVRpbWU7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGNyZWF0ZV90aW1lIEZST00gdmFsaWQiLCBMaW1pdCA9PiAxICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDcmVhdGVUaW1lID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoJENyZWF0ZVRpbWUpIHsKICAgICAgICBpZiAoICRDcmVhdGVUaW1lICF+IC9eXGRcZFxkXGQtKFxkfFxkXGQpLShcZHxcZFxkKVxzKFxkfFxkXGQpOihcZHxcZFxkKTooXGR8XGRcZCkvICkgewogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiJENyZWF0ZVRpbWUgaXMgbm90IHRoZSByaWdodCBmb3JtYXQgJ3l5eXktbW0tZGQgaGg6bW06OnNzJyAocGxlYXNlIGNoZWNrIFwkRU5We05MU19EQVRFX0ZPUk1BVH0pLiI7CiAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiTkxTX0RBVEVfRm9ybWF0IGhhcyB0aGUgcmlnaHQgZm9ybWF0ICgkQ3JlYXRlVGltZSkuIjsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgIH0KICAgIH0KICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdOTFNfREFURV9TRUxFQ1RfRk9STUFUJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgTkxTX0RBVEVfRk9STUFUIGJ5IHVzaW5nIFNFTEVDVCBzdGF0ZW1lbnQuIiwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwiOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICIkRmlsZSIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaCggU3RyaW5nID0+ICRDb250ZW50ICk7CiAgICAgICAgICAgIGZvciBteSAkVGFibGUgKCBAeyAkWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCAgID0+ICJzZWxlY3QgKiBmcm9tICRUYWJsZS0+e05hbWV9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0ID0+IDEKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiJFRhYmxlLT57TmFtZX0sICI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiVGFibGUgZG9uJ3QgZXhpc3RzOiAkTWVzc2FnZS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50IHRhYmxlcyBjaGVja2VkLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLiIsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBmaW5kIGZpbGUgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0KICAgICAgICAtPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIHRvX2NoYXIoY3VycmVudF90aW1lc3RhbXAsJ1lZWVktTU0tREQgSEgyNDpNSTpTUycpIEZST00gRFVBTCIgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERiVGltZSA9ICRSb3dbMF07CiAgICB9CiAgICBteSAkVGltZUFwcGxpY2F0aW9uU2VydmVyID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgbXkgJFRpbWVEYXRhYmFzZVNlcnZlciAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkRGJUaW1lLAogICAgKTsKCiAgICBteSAkVGltZURpZmZlcmVuY2UgPSAwOwogICAgbXkgJFJhbmdlICAgICAgICAgID0gMTA7CiAgICAkVGltZURpZmZlcmVuY2UgPSAkVGltZUFwcGxpY2F0aW9uU2VydmVyIC0gJFRpbWVEYXRhYmFzZVNlcnZlcjsKICAgIGlmICggKCAkVGltZURpZmZlcmVuY2UgPj0gKCAkUmFuZ2UgKiAtMSApICkgJiYgKCAkVGltZURpZmZlcmVuY2UgPD0gJFJhbmdlICkgKSB7CiAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyIHRpbWUgYW5kIGRhdGFiYXNlIHNlcnZlciB0aW1lLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBhIG1hdGVyaWFsIGRpZmZlcmVuY2UgKCcKICAgICAgICAgICAgLiAkVGltZURpZmZlcmVuY2UKICAgICAgICAgICAgLiAiIHNlY29uZHMpIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyICgkVGltZUFwcGxpY2F0aW9uU2VydmVyKSBhbmQgZGF0YWJhc2Ugc2VydmVyICgkVGltZURhdGFiYXNlU2VydmVyKSB0aW1lLiI7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0N1cnJlbnQgVGltZXN0YW1wIENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgIlN5c3RlbSBUaW1lIiB2cyAiQ3VycmVudCBUaW1lc3RhbXAiLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9tc3NxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG1zc3FsLnBtLHYgMS4xOSAyMDExLzA1LzAyIDE4OjM0OjMyIG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6bXNzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE5ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6TVNTUUwnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9WZXJzaW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdmVyc2lvbiBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ0NvdWxkIG5vdCBkZXRlcm1pbmUgTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgdmVyc2lvbi4nOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBAQHZlcnNpb24nLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1lc3NhZ2UgPSAkUm93WzBdOwogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnVmVyc2lvbicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRhdGFiYXNlIHZlcnNpb24uJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RhdGFiYXNlU2l6ZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIERhdGFiYXNlIHNpemUgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdDb3VsZCBub3QgZGV0ZXJtaW5lIGRhdGFiYXNlIHNpemUuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdleGVjIHNwX3NwYWNldXNlZCcsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWVzc2FnZSA9ICJEYXRhYmFzZSAkUm93WzBdIGlzICRSb3dbMV0gbGFyZ2UsIG9mIHdoaWNoICRSb3dbMl0gaXMgYXZhaWxhYmxlLiI7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgfQoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdTaXplJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZGF0YWJhc2Ugc2l6ZS4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfRGF0YWJhc2VIb3N0bmFtZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIERhdGFiYXNlIHNpemUgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdDb3VsZCBub3QgZGV0ZXJtaW5lIGRhdGFiYXNlIGhvc3RuYW1lLic7CgogICAgaWYgKCBteSAkRGF0YWJhc2VIb3N0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RhdGFiYXNlSG9zdCcpICkgewogICAgICAgICRNZXNzYWdlID0gJERhdGFiYXNlSG9zdDsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0hvc3RuYW1lJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZGF0YWJhc2UgaG9zdG5hbWUuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwnOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICRGaWxlICkgKSB7CiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goIFN0cmluZyA9PiAkQ29udGVudCApOwogICAgICAgICAgICBmb3IgbXkgJFRhYmxlICggQHsgJFhNTEhhc2hbMV0tPntkYXRhYmFzZX0tPlsxXS0+e1RhYmxlfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFRhYmxlLT57TmFtZX0gZXEgJ3N5c3RlbV91c2VyJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhYmxlLT57TmFtZX0gPSAnc3lzdGVtX3VzZXIyJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCAgID0+ICJzZWxlY3QgKiBmcm9tICRUYWJsZS0+e05hbWV9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0ID0+IDEKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiJFRhYmxlLT57TmFtZX0sICI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiVGFibGUgZG9lc24ndCBleGlzdDogJE1lc3NhZ2UiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50IHRhYmxlcy4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENoZWNrJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLicsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENoZWNrJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLicsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAiQ2FuJ3Qgb3BlbiBmaWxlICRGaWxlOiAkISIsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAnQ3JpdGljYWwnLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhID0gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAiQ2FuJ3QgZmluZCBmaWxlICRGaWxlISIsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQ3VycmVudFRpbWVzdGFtcENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSAgID0ge307CiAgICBteSAkRGJUaW1lID0gJyc7CgogICAgIyBDdXJyZW50IFRpbWVzdGFtcCBjaGVjawogICAgbXkgJENoZWNrICAgPSAnJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICJTRUxFQ1QgY3VycmVudF90aW1lc3RhbXAiICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYlRpbWUgPSAkUm93WzBdOwogICAgfQogICAgbXkgJFRpbWVBcHBsaWNhdGlvblNlcnZlciA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKICAgIG15ICRUaW1lRGF0YWJhc2VTZXJ2ZXIgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICBTdHJpbmcgPT4gJERiVGltZSwKICAgICk7CgogICAgbXkgJFRpbWVEaWZmZXJlbmNlID0gMDsKICAgIG15ICRSYW5nZSAgICAgICAgICA9IDEwOwogICAgJFRpbWVEaWZmZXJlbmNlID0gJFRpbWVBcHBsaWNhdGlvblNlcnZlciAtICRUaW1lRGF0YWJhc2VTZXJ2ZXI7CiAgICBpZiAoICggJFRpbWVEaWZmZXJlbmNlID49ICggJFJhbmdlICogLTEgKSApICYmICggJFRpbWVEaWZmZXJlbmNlIDw9ICRSYW5nZSApICkgewogICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgPSAnVGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGFwcGxpY2F0aW9uIHNlcnZlciB0aW1lIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgdGltZS4nOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgPSAnVGhlcmUgaXMgYSBtYXRlcmlhbCBkaWZmZXJlbmNlICgnCiAgICAgICAgICAgIC4gJFRpbWVEaWZmZXJlbmNlCiAgICAgICAgICAgIC4gIiBzZWNvbmRzKSBiZXR3ZWVuIGFwcGxpY2F0aW9uIHNlcnZlciAoJFRpbWVBcHBsaWNhdGlvblNlcnZlcikgYW5kIGRhdGFiYXNlIHNlcnZlciAoJFRpbWVEYXRhYmFzZVNlcnZlcikgdGltZS4iOwogICAgfQoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdDdXJyZW50IFRpbWVzdGFtcCBDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrICJTeXN0ZW0gVGltZSIgdnMgIkN1cnJlbnQgVGltZXN0YW1wIi4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9wb3N0Z3Jlc3FsLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogcG9zdGdyZXNxbC5wbSx2IDEuMjAgMjAxMS8wNS8yNiAxMzozMDo0MiBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U6OnBvc3RncmVzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIwICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6UG9zdGdyZVNRTCcpOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY2hlY2tzIHNob3VsZCBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBzb3J0IGdyZXAgeyAkQ2hlY2tzLT57JF99IH0ga2V5cyAleyRDaGVja3N9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQEVuYWJsZWRDaGVja0Z1bmN0aW9ucykgewoKICAgICAgICAjIHByZXBlbmQgYW4gdW5kZXJzY29yZQogICAgICAgICRGdW5jdGlvbk5hbWUgPSAnXycgLiAkRnVuY3Rpb25OYW1lOwoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwnOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICRGaWxlICkgKSB7CiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goIFN0cmluZyA9PiAkQ29udGVudCApOwogICAgICAgICAgICBmb3IgbXkgJFRhYmxlICggQHsgJFhNTEhhc2hbMV0tPntkYXRhYmFzZX0tPlsxXS0+e1RhYmxlfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgICA9PiAic2VsZWN0ICogZnJvbSAkVGFibGUtPntOYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW1pdCA9PiAxCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRUYWJsZS0+e05hbWV9LCAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIm5vbmV4aXN0aW5nIHRhYmxlKHMpOiAkTWVzc2FnZS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50IHRhYmxlcyBjaGVja2VkLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLicsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBmaW5kIGZpbGUgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RhdGVTdHlsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIERhdGVzdHlsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIERhdGVTdHlsZSBmb3VuZC4nOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyBhbGwnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXkRhdGVTdHlsZS9pICkgewogICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gL15JU08vaSApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMV0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlVua25vd24gRGF0ZVN0eWxlICgkUm93WzFdKSBuZWVkIElTTy4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGVTdHlsZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIERhdGVTdHlsZS4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICB9LAogICAgICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9VVEY4U2VydmVyQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdXRmLTggc2VydmVyIGNoZWNrCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Q2hhcnNldCcpID1+IC91dGYoXC04fDgpL2kgKSB7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICdObyBzZXJ2ZXJfZW5jb2RpbmcgZm91bmQuJzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IGFsbCcgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15zZXJ2ZXJfZW5jb2RpbmcvaSApIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiU2V0dGluZyBzZXJ2ZXJfZW5jb2RpbmcgZm91bmQsIGJ1dCBpdCdzIHNldCB0byAnJFJvd1sxXScgKG5lZWQgdG8gYmUgVU5JQ09ERSBvciBVVEY4KS4iOwogICAgICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC8oVU5JQ09ERXx1dGYoOHxcLTgpKS9pICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NlcnZlciBDb25uZWN0aW9uICh1dGY4KScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayB0aGUgdXRmOCBzZXJ2ZXIgY29ubmVjdGlvbi4nLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVVRGOENsaWVudENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHV0Zi04IGNsaWVudCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnTm8gY2xpZW50X2VuY29kaW5nIGZvdW5kLic7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyBhbGwnICk7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eY2xpZW50X2VuY29kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gIlNldHRpbmcgY2xpZW50X2VuY29kaW5nIGZvdW5kLCBidXQgaXQncyBzZXQgdG8gJyRSb3dbMV0nIChuZWVkIHRvIGJlIFVOSUNPREUgb3IgVVRGOCkiOwogICAgICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC8oVU5JQ09ERXx1dGYoOHxcLTgpKS9pICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0NsaWVudCBDb25uZWN0aW9uICh1dGY4KScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayB0aGUgdXRmOCBjbGllbnQgY29ubmVjdGlvbi4nLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVmVyc2lvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHZlcnNpb24gY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyBQb3N0Z3JlU1FMIHZlcnNpb24gZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgc2VydmVyX3ZlcnNpb24nICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXihcZHsxLDN9KS4qJC8gKSB7CiAgICAgICAgICAgIGlmICggJDEgPiA3ICkgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiUG9zdGdyZVNRTCAkUm93WzBdIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3UgdXNlIFBvc3RncmVTUUwgdmVyc2lvbiAkUm93WzBdLCB5b3Ugc2hvdWxkIHVzZSA4Lnggb3IgaGlnbmVyLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIlVua25vd24gUG9zdGdyZVNRTCB2ZXJzaW9uICRSb3dbMF0uIjsKICAgICAgICB9CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnVmVyc2lvbicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRhdGFiYXNlIHZlcnNpb24uJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGN1cnJlbnRfdGltZXN0YW1wIiApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGJUaW1lID0gJFJvd1swXTsKICAgIH0KICAgIG15ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICBteSAkVGltZURhdGFiYXNlU2VydmVyICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICREYlRpbWUsCiAgICApOwoKICAgIG15ICRUaW1lRGlmZmVyZW5jZSA9IDA7CiAgICBteSAkUmFuZ2UgICAgICAgICAgPSAxMDsKICAgICRUaW1lRGlmZmVyZW5jZSA9ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgLSAkVGltZURhdGFiYXNlU2VydmVyOwogICAgaWYgKCAoICRUaW1lRGlmZmVyZW5jZSA+PSAoICRSYW5nZSAqIC0xICkgKSAmJiAoICRUaW1lRGlmZmVyZW5jZSA8PSAkUmFuZ2UgKSApIHsKICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGltZSBhbmQgZGF0YWJhc2Ugc2VydmVyIHRpbWUuJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIGEgbWF0ZXJpYWwgZGlmZmVyZW5jZSAoJwogICAgICAgICAgICAuICRUaW1lRGlmZmVyZW5jZQogICAgICAgICAgICAuICIgc2Vjb25kcykgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgKCRUaW1lQXBwbGljYXRpb25TZXJ2ZXIpIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgKCRUaW1lRGF0YWJhc2VTZXJ2ZXIpIHRpbWUuIjsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQ3VycmVudCBUaW1lc3RhbXAgQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayAiU3lzdGVtIFRpbWUiIHZzICJDdXJyZW50IFRpbWVzdGFtcCIuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9teXNxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG15c3FsLnBtLHYgMS4zMSAyMDExLzA1LzI3IDE0OjMzOjMzIG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6bXlzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMxICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OkRhdGFiYXNlOjpNeVNRTCcpOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY2hlY2tzIHNob3VsZCBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBzb3J0IGdyZXAgeyAkQ2hlY2tzLT57JF99IH0ga2V5cyAleyRDaGVja3N9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQEVuYWJsZWRDaGVja0Z1bmN0aW9ucykgewoKICAgICAgICAjIHByZXBlbmQgYW4gdW5kZXJzY29yZQogICAgICAgICRGdW5jdGlvbk5hbWUgPSAnXycgLiAkRnVuY3Rpb25OYW1lOwoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgpzdWIgX1ZlcnNpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdmVyc2lvbiBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIE15U1FMIHZlcnNpb24gZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBpZiByb3cgbm90IHZlcnNpb24gcm93LCBuZXh0LgogICAgICAgIGlmICggJFJvd1swXSAhfiAvXnZlcnNpb24kL2kgKSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRSb3dbMV0gPX4gL14oXGR7MSwzfSlcLihcZHsxLDN9KS4qJC8gKSB7CiAgICAgICAgICAgIGlmICggJDEgPj0gNCApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIk15U1FMICRSb3dbMV0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIk15U1FMIHZlcnNpb24gJFJvd1sxXSwgeW91IHNob3VsZCB1c2UgNC4xIG9yIGhpZ2hlci4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIlVua25vd24gTXlTUUwgdmVyc2lvbiAkUm93WzFdIjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnRGF0YWJhc2UgVmVyc2lvbicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRhdGFiYXNlIHZlcnNpb24uJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhTdXBwb3J0Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHV0Zi04IHN1cHBvcnQgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgIX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGFiYXNlICh1dGY4KScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRhdGFiYXNlIHV0Zjggc3VwcG9ydC4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICdObyBkYXRhYmFzZSB2ZXJzaW9uIGZvdW5kLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgIH07CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHZhcmlhYmxlcycgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgbmV4dCByb3cgaWYgbm90IHZlcnNpb24KICAgICAgICBuZXh0IGlmICRSb3dbMF0gIX4gL152ZXJzaW9uJC9pOwoKICAgICAgICAjIGZpbmQgdGhlIHZlcnNpb24gbnVtYmVyCiAgICAgICAgaWYgKCAkUm93WzFdID1+IC9eKDRcLigxfDJ8M3w0fDUpfDVcLnw2XC58N1wuKS8gKSB7CiAgICAgICAgICAgICREYXRhLT57Q29tbWVudH0gPSAnWW91ciBkYXRhYmFzZSB2ZXJzaW9uIHN1cHBvcnRzIHV0ZjguJzsKICAgICAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdPSyc7CgogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJ1dGY4IGlzIG5vdCBzdXBwb3J0ZWQgKE15U1FMICRSb3dbMV0pLiI7CiAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdGYWlsZWQnOwogICAgfQoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9VVEY4Q2xpZW50Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIGNoYXJhY3Rlcl9zZXRfY2xpZW50IHNldHRpbmcgZm91bmQuJzsKCiAgICAjIHV0Zi04IGNsaWVudCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSAhfiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgI25leHQgaWYgcm93IG5vdCBjaGFyYWN0ZXJfc2V0X2NsaWVudAogICAgICAgIG5leHQgaWYgJFJvd1swXSAhfiAvXmNoYXJhY3Rlcl9zZXRfY2xpZW50L2k7CgogICAgICAgIGlmICggJFJvd1sxXSA9fiAvdXRmOC8gKSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91ciBjbGllbnQgY29ubmVjdGlvbiBpcyAkUm93WzFdLiI7CgogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KICAgICAgICAkTWVzc2FnZSA9ICJGb3VuZCBjaGFyYWN0ZXJfc2V0X2NsaWVudCwgYnV0IGl0J3Mgc2V0IHRvICRSb3dbMV0gKG5lZWRzIHRvIGJlIHV0ZjgpLiI7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0NsaWVudCBDb25uZWN0aW9uICh1dGY4KScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIHRoZSBjbGllbnQgdXNlcyB1dGY4IGZvciB0aGUgY29ubmVjdGlvbi4nLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgIH07CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhEYXRhYmFzZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1dGYtOCBkYXRhYmFzZSBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSAhfiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyBjaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIHNldHRpbmcgZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15jaGFyYWN0ZXJfc2V0X2RhdGFiYXNlL2kgKSB7CiAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICA9ICJDaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIHNldHRpbmcgZm91bmQsIGJ1dCBpdCdzIHNldCB0byAkUm93WzFdIChuZWVkcyB0byBiZSB1dGY4KS4iOwogICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gL3V0ZjgvICkgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91ciBkYXRhYmFzZSBjaGFyYWN0ZXIgc2V0dGluZyBpcyAkUm93WzFdLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGFiYXNlIENoYXJhY3RlciAodXRmOCknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBpZiB0aGUgZGF0YWJhc2UgdXNlcyB1dGY4IGFzIGNoYXJzZXQuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhUYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdXRmLTggdGFibGUgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgPX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICBteSAkQ2hlY2sgICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSAgPSAnJzsKICAgICAgICBteSAkTWVzc2FnZTIgPSAnJzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHRhYmxlIHN0YXR1cycgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMTRdICF+IC9edXRmOC9pICkgewogICAgICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gJywgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkUm93WzBdXFskUm93WzE0XVxdIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlMiA9ICRSb3dbMTRdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAkTWVzc2FnZSA9ICJJbnZhbGlkIGNoYXJzZXQgY29sbGF0aW9uIGZvcjogJE1lc3NhZ2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICRNZXNzYWdlMjsKICAgICAgICB9CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDb2xsYXRpb24gKHV0ZjgpJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIHRoZSB1dGY4IHRhYmxlIGNoYXJzZXQgY29sbGF0aW9uLicsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJZb3VyIGNoYXJzZXQgY29sbGF0aW9uIGlzIHNldCB0byAkTWVzc2FnZS4iLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gJERhdGE7CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBfTWF4QWxsb3dlZFBhY2thZ2VDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIG1heF9hbGxvd2VkX3BhY2tldCBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vICJtYXhfYWxsb3dlZF9wYWNrZXQiIGNvbmZpZ3VyYXRpb24gZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15tYXhfYWxsb3dlZF9wYWNrZXQvaSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzFdIDwgMTAyNCAqIDEwMjQgKiA3ICkgewogICAgICAgICAgICAgICAgJFJvd1sxXSAgPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlwibWF4X2FsbG93ZWRfcGFja2V0XCIgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIDcgTUIgKGl0J3MgJFJvd1sxXSBNQikuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSb3dbMV0gID0gaW50KCAkUm93WzFdIC8gMTAyNCAvIDEwMjQgKTsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIllvdXIgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzICRSb3dbMV0gTUIuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdNYXggUGFja2FnZSBTaXplJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgIm1heF9hbGxvd2VkX3BhY2tldCIgc2V0dGluZy4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfUXVlcnlDYWNoZVNpemVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHF1ZXJ5X2NhY2hlX3NpemUgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyAicXVlcnlfY2FjaGVfc2l6ZSIgc2V0dGluZyBmb3VuZC4nOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyB2YXJpYWJsZXMnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXnF1ZXJ5X2NhY2hlX3NpemUvaSApIHsKICAgICAgICAgICAgaWYgKCAhJFJvd1sxXSApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gJ1RoZSBzZXR0aW5nICJxdWVyeV9jYWNoZV9zaXplIiBzaG91bGQgYmUgdXNlZC4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFJvd1sxXSA8IDEwMjQgKiAxMDI0ICogMTAgKSB7CiAgICAgICAgICAgICAgICAkUm93WzFdID0gaW50KCAkUm93WzFdIC8gMTAyNCAvIDEwMjQgKTsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gIlRoZSBzZXR0aW5nIFwicXVlcnlfY2FjaGVfc2l6ZVwiIHNob3VsZCBiZSBoaWdoZXIgdGhhbiAxMCBNQiAoaXQncyAkUm93WzFdIE1CKS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJvd1sxXSAgPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJFJvd1sxXSBNQiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnUXVlcnkgQ2FjaGUgU2l6ZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrICJxdWVyeV9jYWNoZV9zaXplIiBzZXR0aW5nLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9DdXJyZW50VGltZXN0YW1wQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhICAgPSB7fTsKICAgIG15ICREYlRpbWUgPSAnJzsKCiAgICAjIEN1cnJlbnQgVGltZXN0YW1wIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICcnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gIlNFTEVDVCBjdXJyZW50X3RpbWVzdGFtcCIgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERiVGltZSA9ICRSb3dbMF07CiAgICB9CiAgICBteSAkVGltZUFwcGxpY2F0aW9uU2VydmVyID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgbXkgJFRpbWVEYXRhYmFzZVNlcnZlciAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkRGJUaW1lLAogICAgKTsKCiAgICBteSAkVGltZURpZmZlcmVuY2UgPSAwOwogICAgbXkgJFJhbmdlICAgICAgICAgID0gMTA7CiAgICAkVGltZURpZmZlcmVuY2UgPSAkVGltZUFwcGxpY2F0aW9uU2VydmVyIC0gJFRpbWVEYXRhYmFzZVNlcnZlcjsKICAgIGlmICggKCAkVGltZURpZmZlcmVuY2UgPj0gKCAkUmFuZ2UgKiAtMSApICkgJiYgKCAkVGltZURpZmZlcmVuY2UgPD0gJFJhbmdlICkgKSB7CiAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyIHRpbWUgYW5kIGRhdGFiYXNlIHNlcnZlciB0aW1lLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBhIG1hdGVyaWFsIGRpZmZlcmVuY2UgKCcKICAgICAgICAgICAgLiAkVGltZURpZmZlcmVuY2UKICAgICAgICAgICAgLiAiIHNlY29uZHMpIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyICgkVGltZUFwcGxpY2F0aW9uU2VydmVyKSBhbmQgZGF0YWJhc2Ugc2VydmVyICgkVGltZURhdGFiYXNlU2VydmVyKSB0aW1lLiI7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0N1cnJlbnQgVGltZXN0YW1wIENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgIlN5c3RlbSBUaW1lIiB2cyAiQ3VycmVudCBUaW1lc3RhbXAiLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwnOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICRGaWxlICkgKSB7CiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goIFN0cmluZyA9PiAkQ29udGVudCApOwoKICAgICAgICAgICAgbXkgQFByb2JsZW1zOwogICAgICAgICAgICBmb3IgbXkgJFRhYmxlICggQHsgJFhNTEhhc2hbMV0tPntkYXRhYmFzZX0tPlsxXS0+e1RhYmxlfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAnQ0hFQ0sgVEFCTEUnLXN0YXRlbWVudCB0byBkZXRlcm1pbmUgc3RhdGUgb2YgZWFjaCB0YWJsZQogICAgICAgICAgICAgICAgICAgICMgKHdoaWNoIG1heSB5aWVsZCBzZXZlcmFsIGxpbmVzIHBlciB0YWJsZSwgdGhlIGxhc3Qgb2Ygd2hpY2ggd2lsbAogICAgICAgICAgICAgICAgICAgICMgY29udGFpbiB0aGUgb3ZlcmFsbCBzdGF0ZSBvZiB0aGF0IHRhYmxlKQogICAgICAgICAgICAgICAgICAgICMgRG8gcXVpY2sgY2hlY2tzIG9uIHRhYmxlcywgb3RoZXIgd2F5IGl0IHRha2VzIG92ZXIgNDIwIHNlYwogICAgICAgICAgICAgICAgICAgICMgb3IgbG9uZ2VyIHRvIGNoZWNrIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiQ0hFQ0sgVEFCTEUgJFRhYmxlLT57TmFtZX0gRkFTVCBRVUlDSyIgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0YXR1cyA9ICRSb3dbM107ICAgICMgbG9vayBhdCBmaWVsZCAnTXNnX3RleHQnCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiAkU3RhdHVzID1+IC9eKE9LfFRhYmxlXHNpc1xzYWxyZWFkeVxzdXBcc3RvXHNkYXRlKS9pOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBQcm9ibGVtcywgIiRUYWJsZS0+e05hbWV9XFskU3RhdHVzXF0iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAUHJvYmxlbXMsICIkVGFibGUtPntOYW1lfVxbdW5hYmxlIHRvIGNoZWNrIHRhYmxlXF0iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQFByb2JsZW1zKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9IGpvaW4gIlxuIiwgQFByb2JsZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50IHRhYmxlcyBjaGVja2VkLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLicsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBmaW5kIGZpbGUgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RhdGFiYXNlU2l6ZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgbWF4X2FsbG93ZWRfcGFja2V0IGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnQ291bGQgbm90IGRldGVybWluZSBkYXRhYmFzZSBzaXplLic7CiAgICBteSAkREJOYW1lOwoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICJTRUxFQ1QgREFUQUJBU0UoKSIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gKSB7CiAgICAgICAgICAgICREQk5hbWUgPSAkUm93WzBdOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJERCTmFtZSkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gIlNFTEVDVCBST1VORCgoU1VNKGRhdGFfbGVuZ3RoICsgaW5kZXhfbGVuZ3RoKSAvIDEwMjQgLyAxMDI0IC8gMTAyNCksMykgIgogICAgICAgICAgICAgICAgLiAiRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuVEFCTEVTIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gR1JPVVAgQlkgdGFibGVfc2NoZW1hIiwKICAgICAgICAgICAgQmluZCAgPT4gWyBcJERCTmFtZSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIkRhdGFiYXNlIHNpemUgaXMgJFJvd1swXSBHQi4iOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE1lc3NhZ2UgPSAnQ291bGQgbm90IGRldGVybWluZSBkYXRhYmFzZSBuYW1lLic7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGFiYXNlIFNpemUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdTaXplIG9mIHRoZSBjdXJyZW50IGRhdGFiYXNlLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBXZWJzZXJ2ZXIucG0sdiAxLjEwIDIwMTAvMDIvMDkgMTk6NTQ6MTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlciAtIGdsb2JhbCBzeXN0ZW0gaW5mb3JtYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbiB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgV2Vic2VydmVyIGluZm8gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJFdlYnNlcnZlckFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgV2Vic2VydmVycwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgIyAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+Q2hlY2soKTsKICAgICMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCB1c2VkIFdlYnNlcnZlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIFdlYnNlcnZlciBpcyBjb25maWd1cmVkCiAgICBteSAkV2Vic2VydmVyVHlwZSA9ICcnOwogICAgaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gPX4gL2FwYWNoZS9pICkgewogICAgICAgICRXZWJzZXJ2ZXJUeXBlID0gJ0FwYWNoZSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkV2Vic2VydmVyVHlwZSA9ICdJSVMnOwogICAgfQoKICAgICMgdHJ5IHRvIGdldCBhdmFpbGFibGUgbW9kdWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXInOwoKICAgICMgcmVhZCBhbGwgYXZhaWxhYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYiggJERpck5hbWUgLiAnLyoucG0nICk7CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0KSB7CgogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBpZiAoICRXZWJzZXJ2ZXJUeXBlID1+IC9eJEZpbGUvaSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6JEZpbGUiOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBuZXcgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAgICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBcnJheVJlZiAmJiByZWYoJEFycmF5UmVmKSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBAeyREYXRhQXJyYXl9LCBAeyRBcnJheVJlZn0gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMCAkICREYXRlOiAyMDEwLzAyLzA5IDE5OjU0OjE3ICQKCj1jdXQK
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==
cGFja2FnZSBMaW51eDo6RGlzdHJpYnV0aW9uOwoKdXNlIDUuMDA2MDAwOwp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpyZXF1aXJlIEV4cG9ydGVyOwoKb3VyIEBJU0EgPSBxdyhFeHBvcnRlcik7CgpvdXIgQEVYUE9SVF9PSyA9IHF3KCBkaXN0cmlidXRpb25fbmFtZSBkaXN0cmlidXRpb25fdmVyc2lvbiApOwoKb3VyICRWRVJTSU9OID0gJzAuMjEnOwoKb3VyICRyZWxlYXNlX2ZpbGVzX2RpcmVjdG9yeT0nL2V0Yyc7Cm91ciAkc3RhbmRhcmRfcmVsZWFzZV9maWxlID0gJ2xzYi1yZWxlYXNlJzsKCm91ciAlcmVsZWFzZV9maWxlcyA9ICgKICAgICdnZW50b28tcmVsZWFzZScgICAgICAgID0+ICdnZW50b28nLAogICAgJ2ZlZG9yYS1yZWxlYXNlJyAgICAgICAgPT4gJ2ZlZG9yYScsCiAgICAnY2VudG9zLXJlbGVhc2UnICAgICAgICA9PiAnY2VudG9zJywKICAgICd0dXJib2xpbnV4LXJlbGVhc2UnICAgID0+ICd0dXJib2xpbnV4JywKICAgICdtYW5kcmFrZS1yZWxlYXNlJyAgICAgID0+ICdtYW5kcmFrZScsCiAgICAnbWFuZHJha2VsaW51eC1yZWxlYXNlJyA9PiAnbWFuZHJha2VsaW51eCcsCiAgICAnZGViaWFuX3ZlcnNpb24nICAgICAgICA9PiAnZGViaWFuJywKICAgICdkZWJpYW5fcmVsZWFzZScgICAgICAgID0+ICdkZWJpYW4nLAogICAgJ1N1U0UtcmVsZWFzZScgICAgICAgICAgPT4gJ3N1c2UnLAogICAgJ2tub3BwaXgtdmVyc2lvbicgICAgICAgPT4gJ2tub3BwaXgnLAogICAgJ3llbGxvd2RvZy1yZWxlYXNlJyAgICAgPT4gJ3llbGxvd2RvZycsCiAgICAnc2xhY2t3YXJlLXZlcnNpb24nICAgICA9PiAnc2xhY2t3YXJlJywKICAgICdzbGFja3dhcmUtcmVsZWFzZScgICAgID0+ICdzbGFja3dhcmUnLAogICAgJ3JlZGZsYWctcmVsZWFzZScgICAgICAgPT4gJ3JlZGZsYWcnLAogICAgJ3JlZGhhdC1yZWxlYXNlJyAgICAgICAgPT4gJ3JlZGhhdCcsCiAgICAncmVkaGF0X3ZlcnNpb24nICAgICAgICA9PiAncmVkaGF0JywKICAgICdjb25lY3RpdmEtcmVsZWFzZScgICAgID0+ICdjb25lY3RpdmEnLAogICAgJ2ltbXVuaXgtcmVsZWFzZScgICAgICAgPT4gJ2ltbXVuaXgnLAogICAgJ3Rpbnlzb2ZhLXJlbGVhc2UnICAgICAgPT4gJ3Rpbnlzb2ZhJywKICAgICd0cnVzdGl4LXJlbGVhc2UnICAgICAgID0+ICd0cnVzdGl4JywKICAgICdhZGFtYW50aXhfdmVyc2lvbicgICAgID0+ICdhZGFtYW50aXgnLAogICAgJ3lvcGVyLXJlbGVhc2UnICAgICAgICAgPT4gJ3lvcGVyJywKICAgICdhcmNoLXJlbGVhc2UnICAgICAgICAgID0+ICdhcmNoJywKICAgICdsaWJyYW5ldF92ZXJzaW9uJyAgICAgID0+ICdsaWJyYW5ldCcsCiAgICAndmEtcmVsZWFzZScgICAgICAgICAgICA9PiAndmEtbGludXgnLAogICAgJ3BhcmR1cy1yZWxlYXNlJyAgICAgICAgPT4gJ3BhcmR1cycsCik7CgpvdXIgJXZlcnNpb25fbWF0Y2ggPSAoCiAgICAnZ2VudG9vJyAgICAgICAgICAgICAgICA9PiAnR2VudG9vIEJhc2UgU3lzdGVtIHJlbGVhc2UgKC4qKScsCiAgICAnZGViaWFuJyAgICAgICAgICAgICAgICA9PiAnKC4rKScsCiAgICAnc3VzZScgICAgICAgICAgICAgICAgICA9PiAnVkVSU0lPTiA9ICguKiknLAogICAgJ2ZlZG9yYScgICAgICAgICAgICAgICAgPT4gJ0ZlZG9yYSg/OiBDb3JlKT8gcmVsZWFzZSAoXGQrKSBcKCcsCiAgICAncmVkZmxhZycgICAgICAgICAgICAgICA9PiAnUmVkIEZsYWcgKD86RGVza3RvcHxMaW51eCkgKD86cmVsZWFzZSB8XCgpKC4qPykoPzogXCguKyk/XCknLAogICAgJ3JlZGhhdCcgICAgICAgICAgICAgICAgPT4gJ1JlZCBIYXQoPzogRW50ZXJwcmlzZSk/IExpbnV4KD86IFNlcnZlcik/IHJlbGVhc2UgKC4qKSBcKCcsCiAgICAnc2xhY2t3YXJlJyAgICAgICAgICAgICA9PiAnXlNsYWNrd2FyZSAoLispJCcsCiAgICAncGFyZHVzJyAgICAgICAgICAgICAgICA9PiAnXlBhcmR1cyAoLispJCcsCiAgICAnY2VudG9zJyAgICAgICAgICAgICAgICA9PiAnXkNlbnRPUyg/OiBMaW51eCk/IHJlbGVhc2UgKC4rKSg/OlxzXChGaW5hbFwpKScsCiAgICAnc2NpZW50aWZpYycgICAgICAgICAgICA9PiAnXlNjaWVudGlmaWMgTGludXggcmVsZWFzZSAoLispIFwoJywKKTsKCgppZiAoJF5PIG5lICdsaW51eCcpIHsKIyAgIHJlcXVpcmUgQ2FycDsKIyAgIENhcnA6OmNyb2FrKCd5b3UgYXJlIHRyeWluZyB0byB1c2UgYSBsaW51eCBzcGVjaWZpYyBtb2R1bGUgb24gYSBkaWZmZXJlbnQgT1MnKTsKfQoKc3ViIG5ldyB7CiAgICBteSAlc2VsZiA9ICgKICAgICAgICAnRElTVFJJQl9JRCcgICAgICAgICAgPT4gJycsCiAgICAgICAgJ0RJU1RSSUJfUkVMRUFTRScgICAgID0+ICcnLAogICAgICAgICdESVNUUklCX0NPREVOQU1FJyAgICA9PiAnJywKICAgICAgICAnRElTVFJJQl9ERVNDUklQVElPTicgPT4gJycsCiAgICAgICAgJ3JlbGVhc2VfZmlsZScgICAgICAgID0+ICcnLAogICAgICAgICdwYXR0ZXJuJyAgICAgICAgICAgICA9PiAnJwogICAgKTsKICAgIAogICAgcmV0dXJuIGJsZXNzIFwlc2VsZjsKfQoKc3ViIGRpc3RyaWJ1dGlvbl9uYW1lIHsKICAgIG15ICRzZWxmID0gc2hpZnQgfHwgbmV3KCk7CiAgICBteSAkZGlzdHJvOwogICAgaWYgKCRkaXN0cm8gPSAkc2VsZi0+X2dldF9sc2JfaW5mbygpKXsKICAgICAgICByZXR1cm4gJGRpc3RybyBpZiAoJGRpc3Rybyk7CiAgICB9CgogICAgZm9yZWFjaCAoJ2ZlZG9yYS1yZWxlYXNlJykgewogICAgICAgIGlmICgtZiAiJHJlbGVhc2VfZmlsZXNfZGlyZWN0b3J5LyRfIiAmJiAhLWwgIiRyZWxlYXNlX2ZpbGVzX2RpcmVjdG9yeS8kXyIpewogICAgICAgICAgICBpZiAoLWYgIiRyZWxlYXNlX2ZpbGVzX2RpcmVjdG9yeS8kXyIgJiYgIS1sICIkcmVsZWFzZV9maWxlc19kaXJlY3RvcnkvJF8iKXsKICAgICAgICAgICAgICAgICRzZWxmLT57J0RJU1RSSUJfSUQnfSA9ICRyZWxlYXNlX2ZpbGVzeyRffTsKICAgICAgICAgICAgICAgICRzZWxmLT57J3JlbGVhc2VfZmlsZSd9ID0gJF87CiAgICAgICAgICAgICAgICByZXR1cm4gJHNlbGYtPnsnRElTVFJJQl9JRCd9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZvcmVhY2ggKGtleXMgJXJlbGVhc2VfZmlsZXMpIHsKICAgICAgICBpZiAoLWYgIiRyZWxlYXNlX2ZpbGVzX2RpcmVjdG9yeS8kXyIgJiYgIS1sICIkcmVsZWFzZV9maWxlc19kaXJlY3RvcnkvJF8iKXsKICAgICAgICAgICAgaWYgKC1mICIkcmVsZWFzZV9maWxlc19kaXJlY3RvcnkvJF8iICYmICEtbCAiJHJlbGVhc2VfZmlsZXNfZGlyZWN0b3J5LyRfIil7CiAgICAgICAgICAgICAgICBpZiAoICRyZWxlYXNlX2ZpbGVzeyRffSBlcSAncmVkaGF0JyApIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRyaGVsX2Rlcml2ICgnY2VudG9zJywnc2NpZW50aWZpYycsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57J3BhdHRlcm4nfSA9ICR2ZXJzaW9uX21hdGNoeyRyaGVsX2Rlcml2fTsKICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPnsncmVsZWFzZV9maWxlJ309J3JlZGhhdC1yZWxlYXNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkc2VsZi0+X2dldF9maWxlX2luZm8oKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57J0RJU1RSSUJfSUQnfSA9ICRyaGVsX2Rlcml2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPnsncmVsZWFzZV9maWxlJ30gPSAkXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2VsZi0+eydESVNUUklCX0lEJ307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHNlbGYtPnsncGF0dGVybid9PScnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNlbGYtPnsncmVsZWFzZV9maWxlJ30gPSAkXzsKICAgICAgICAgICAgICAgICRzZWxmLT57J0RJU1RSSUJfSUQnfSA9ICRyZWxlYXNlX2ZpbGVzeyRffTsKICAgICAgICAgICAgICAgIHJldHVybiAkc2VsZi0+eydESVNUUklCX0lEJ307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICB1bmRlZiAKfQoKc3ViIGRpc3RyaWJ1dGlvbl92ZXJzaW9uIHsKICAgIG15ICRzZWxmID0gc2hpZnQgfHwgbmV3KCk7CiAgICBteSAkcmVsZWFzZTsKICAgIHJldHVybiAkcmVsZWFzZSBpZiAoJHJlbGVhc2UgPSAkc2VsZi0+X2dldF9sc2JfaW5mbygnRElTVFJJQl9SRUxFQVNFJykpOwogICAgaWYgKCEgJHNlbGYtPnsnRElTVFJJQl9JRCd9KXsKICAgICAgICAgJHNlbGYtPmRpc3RyaWJ1dGlvbl9uYW1lKCkgb3IgZGllICdObyB2ZXJzaW9uIGJlY2F1c2Ugbm8gZGlzdHJvLic7CiAgICB9CiAgICAkc2VsZi0+eydwYXR0ZXJuJ30gPSAkdmVyc2lvbl9tYXRjaHskc2VsZi0+eydESVNUUklCX0lEJ319OwogICAgJHJlbGVhc2UgPSAkc2VsZi0+X2dldF9maWxlX2luZm8oKTsKICAgICRzZWxmLT57J0RJU1RSSUJfUkVMRUFTRSd9ID0gJHJlbGVhc2U7CiAgICByZXR1cm4gJHJlbGVhc2U7Cn0KCnN1YiBfZ2V0X2xzYl9pbmZvIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkZmllbGQgPSBzaGlmdCB8fCAnRElTVFJJQl9JRCc7CiAgICBteSAkdG1wID0gJHNlbGYtPnsncmVsZWFzZV9maWxlJ307CiAgICBpZiAoIC1yICIkcmVsZWFzZV9maWxlc19kaXJlY3RvcnkvIiAuICRzdGFuZGFyZF9yZWxlYXNlX2ZpbGUgKSB7CiAgICAgICAgJHNlbGYtPnsncmVsZWFzZV9maWxlJ30gPSAkc3RhbmRhcmRfcmVsZWFzZV9maWxlOwogICAgICAgICRzZWxmLT57J3BhdHRlcm4nfSA9ICRmaWVsZCAuICc9KC4rKSc7CiAgICAgICAgbXkgJGluZm8gPSAkc2VsZi0+X2dldF9maWxlX2luZm8oKTsKICAgICAgICBpZiAoJGluZm8pewogICAgICAgICAgICAkc2VsZi0+eyRmaWVsZH0gPSAkaW5mbzsKICAgICAgICAgICAgcmV0dXJuICRpbmZvCiAgICAgICAgfQogICAgfSAKICAgICRzZWxmLT57J3JlbGVhc2VfZmlsZSd9ID0gJHRtcDsKICAgICRzZWxmLT57J3BhdHRlcm4nfSA9ICcnOwogICAgdW5kZWY7Cn0KCnN1YiBfZ2V0X2ZpbGVfaW5mbyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgb3BlbiBteSAkZmgsICc8JywgIiRyZWxlYXNlX2ZpbGVzX2RpcmVjdG9yeS8iIC4gJHNlbGYtPnsncmVsZWFzZV9maWxlJ30gb3IgZGllICdDYW5ub3Qgb3BlbiBmaWxlOiAnLiRyZWxlYXNlX2ZpbGVzX2RpcmVjdG9yeS4nLycgLiAkc2VsZi0+eydyZWxlYXNlX2ZpbGUnfTsKICAgIG15ICRpbmZvID0gJyc7CiAgICBsb2NhbCAkXzsKICAgIHdoaWxlICg8JGZoPil7CiAgICAgICAgY2hvbXAgJF87CiAgICAgICAgKCRpbmZvKSA9ICRfID1+IG0vJHNlbGYtPnsncGF0dGVybid9LzsKICAgICAgICByZXR1cm4gIlxMJGluZm8iIGlmICRpbmZvOwogICAgfQogICAgdW5kZWY7Cn0KCjE7Cl9fRU5EX18KCgo9aGVhZDEgTkFNRQoKTGludXg6OkRpc3RyaWJ1dGlvbiAtIFBlcmwgZXh0ZW5zaW9uIHRvIGRldGVjdCBvbiB3aGljaCBMaW51eCBkaXN0cmlidXRpb24gd2UgYXJlIHJ1bm5pbmcuCgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIExpbnV4OjpEaXN0cmlidXRpb24gcXcoZGlzdHJpYnV0aW9uX25hbWUgZGlzdHJpYnV0aW9uX3ZlcnNpb24pOwoKICBpZihteSAkZGlzdHJvID0gZGlzdHJpYnV0aW9uX25hbWUpIHsKICAgICAgICBteSAkdmVyc2lvbiA9IGRpc3RyaWJ1dGlvbl92ZXJzaW9uKCk7CiAgICBwcmludCAieW91IGFyZSBydW5uaW5nICRkaXN0cm8sIHZlcnNpb24gJHZlcnNpb25cbiI7CiAgfSBlbHNlIHsKICAgIHByaW50ICJkaXN0cmlidXRpb24gdW5rbm93blxuIjsKICB9CgogIE9yIGVsc2UgZG8gaXQgT086CgogIHVzZSBMaW51eDo6RGlzdHJpYnV0aW9uIHF3KGRpc3RyaWJ1dGlvbl9uYW1lIGRpc3RyaWJ1dGlvbl92ZXJzaW9uKTsKCiAgbXkgJGxpbnV4ID0gTGludXg6OkRpc3RyaWJ1dGlvbi0+bmV3OwogIGlmKG15ICRkaXN0cm8gPSAkbGludXgtPmRpc3RyaWJ1dGlvbl9uYW1lKCkpIHsKICAgICAgICBteSAkdmVyc2lvbiA9ICRsaW51eC0+ZGlzdHJpYnV0aW9uX3ZlcnNpb24oKTsKICAgICAgICBwcmludCAieW91IGFyZSBydW5uaW5nICRkaXN0cm8sIHZlcnNpb24gJHZlcnNpb25cbiI7CiAgfSBlbHNlIHsKICAgICAgICBwcmludCAiZGlzdHJpYnV0aW9uIHVua25vd25cbiI7CiAgfQoKPWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIGlzIGEgc2ltcGxlIG1vZHVsZSB0aGF0IHRyaWVzIHRvIGd1ZXNzIG9uIHdoYXQgbGludXggZGlzdHJpYnV0aW9uIHdlIGFyZSBydW5uaW5nIGJ5IGxvb2tpbmcgZm9yIHJlbGVhc2UncyBmaWxlcyBpbiAvZXRjLiAgSXQgbm93IGxvb2tzIGZvciAnbHNiLXJlbGVhc2UnIGZpcnN0IGFzIHRoYXQgc2hvdWxkIGJlIHRoZSBtb3N0IGNvcnJlY3QgYW5kIGFkZHMgdWJ1bnR1IHN1cHBvcnQuICBTZWNvbmRseSwgaXQgd2lsbCBsb29rIGZvciB0aGUgZGlzdHJvIHNwZWNpZmljIGZpbGVzLgoKSXQgY3VycmVudGx5IHJlY29nbml6ZXMgc2xhY2t3YXJlLCBkZWJpYW4sIHN1c2UsIGZlZG9yYSwgcmVkaGF0LCB0dXJib2xpbnV4LCB5ZWxsb3dkb2csIGtub3BwaXgsIG1hbmRyYWtlLCBjb25lY3RpdmEsIGltbXVuaXgsIHRpbnlzb2ZhLCB2YS1saW51eCwgdHJ1c3RpeCwgYWRhbWFudGl4LCB5b3BlciwgYXJjaC1saW51eCwgbGlicmFuZXQsIGdlbnRvbywgdWJ1bnR1LCBzY2llbnRpZmljIGFuZCByZWRmbGFnLgoKSXQgaGFzIGZ1bmN0aW9uIHRvIGdldCB0aGUgdmVyc2lvbiBmb3IgZGViaWFuLCBzdXNlLCBmZWRvcmEsIHJlZGhhdCwgZ2VudG9vLCBzbGFja3dhcmUsIHNjaWVudGlmaWMsIHJlZGZsYWcgYW5kIHVidW50dShsc2IpLiBQZW9wbGUgcnVubmluZyB1bnN1cHBvcnRlZCBkaXN0cm8ncyBhcmUgZ3JlYXRseSBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBwYXRjaGVzIDotKQoKPWhlYWQyIEVYUE9SVAoKTm9uZSBieSBkZWZhdWx0LgoKPWhlYWQxIFRPRE8KCkFkZCB0aGUgY2FwYWJpbGl0eSBvZiByZWNvZ25pemUgdGhlIHZlcnNpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiBmb3IgYWxsIHJlY29nbml6ZWQgZGlzdHJpYnV0aW9ucy4KCj1oZWFkMSBBVVRIT1JTCgpBbGV4YW5kciBDaW9ybmlpIEU8bHQ+YWxleGNob3JueUBnbWFpbC5jb21FPGd0PiwgTDxodHRwOi8vY2hvcm55Lm5ldD4KQWxiZXJ0byBSZSwgRTxsdD5hbGJlcnRvQGFjY2lkaWEubmV0RTxndD4KSnVkaXRoIExlYnplbHRlciwgRTxsdD5qdWRpdGhAb3NkbC5vcmdFPGd0PgoKPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYsIGVpdGhlciBQZXJsIHZlcnNpb24gNS44LjUgb3IsCmF0IHlvdXIgb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiBvZiBQZXJsIDUgeW91IG1heSBoYXZlIGF2YWlsYWJsZS4KCj1jdXQKCg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU3VwcG9ydC5wbSAtIHNob3cgc3VwcG9ydCBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TdXBwb3J0LnBtLHYgMS4zNS4yLjEgMjAxMS8xMS8yMiAyMzo0MDowMSBjZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluU3VwcG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMzUuMi4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgT2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCBUaW1lT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1N1cHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXIgZGF0YQogICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBzZW5kZXIgZW1haWwgYWRyZXNzCiAgICBteSAkU2VuZGVyQWRyZXNzID0gJyc7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpTZW5kZXJFbWFpbCcpICkgewogICAgICAgICRTZW5kZXJBZHJlc3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6U2VuZGVyRW1haWwnKTsKICAgIH0KICAgIGVsc2lmICggJFVzZXJ7VXNlckVtYWlsfSAmJiAkVXNlcntVc2VyRW1haWx9ICF+IC9yb290XEBsb2NhbGhvc3QvICkgewogICAgICAgICRTZW5kZXJBZHJlc3MgPSAkVXNlcntVc2VyRW1haWx9OwogICAgfQogICAgZWxzaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZG1pbkVtYWlsJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQWRtaW5FbWFpbCcpICF+IC9yb290XEBsb2NhbGhvc3QvCiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FkbWluRW1haWwnKSAhfiAvYWRtaW5cQGV4YW1wbGUuY29tLwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VuZGVyQWRyZXNzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FkbWluRW1haWwnKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIENvbmZpZGVudGlhbAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDb25maWRlbnRpYWwnICkgewoKICAgICAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDb25maWRlbnRpYWwnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFVzZXJ7VXNlckxhbmd1YWdlfSAmJiAkVXNlcntVc2VyTGFuZ3VhZ2V9ID1+IC9kZS8gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb25maWRlbnRpYWxDb250ZW50REUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb25maWRlbnRpYWxDb250ZW50RU4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgU2VuZGVyIEluZm9ybWF0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlbmRlckluZm9ybWF0aW9uJyApIHsKCiAgICAgICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VuZGVySW5mb3JtYXRpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlbmRlckFkcmVzcyAgICAgPT4gJFNlbmRlckFkcmVzcywKICAgICAgICAgICAgICAgIFNlbmRlclNhbHV0YXRpb24gPT4gJFVzZXJ7VXNlclNhbHV0YXRpb259LAogICAgICAgICAgICAgICAgU2VuZGVyTmFtZSAgICAgICA9PiAkVXNlcntVc2VyRmlyc3RuYW1lfSAuICcgJyAuICRVc2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBVcGxvYWRTdXBwb3J0SW5mbwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdWJtaXQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlQ3VzdG9tZXJJbmZvOwogICAgICAgIGZvciBteSAkS2V5IChxdyhTZW5kZXIgQ29tcGFueSBTYWx1dGF0aW9uIE5hbWUgU3RyZWV0IFppcCBDaXR5IFBob25lIFNlbmRJbmZvIEJ1Z3ppbGxhSUQpKSB7CiAgICAgICAgICAgICRDdXN0b21lckluZm97JEtleX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlIGJ1dHRvbiBzZW5kIGJlY29tZXMgdGhlIHN1Ym1pdAogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VuZCcgKSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZW5kZXJJbmZvcm1hdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTZW5kZXJBZHJlc3MgICAgID0+ICRTZW5kZXJBZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyU2FsdXRhdGlvbiA9PiAkVXNlcntVc2VyU2FsdXRhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyTmFtZSAgICAgICA9PiAkVXNlcntVc2VyRmlyc3RuYW1lfSAuICcgJyAuICRVc2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFNlbmRNZXNzYWdlID0gJFNlbGYtPntTdXBwb3J0T2JqZWN0fS0+U2VuZEluZm8oCiAgICAgICAgICAgICAgICBDdXN0b21lckluZm8gPT4gXCVDdXN0b21lckluZm8sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VuZE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+ICJTZW50IHRvICgob3RycykpISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnd2FybmluZycsCiAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJ0NhbiBub3Qgc2VuZCBlbWFpbCB0byB0aGUgKChvdHJzKSkgc3VwcG9ydCB0ZWFtIScgLiAiXG5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiWW91IHdpbGwgZmluZCB0aGUgb3RycyBzeXN0ZW0gaW5mb3JtYXRpb24gcGFja2FnZSBhdFxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICJJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgT1RSUyBzdXBwb3J0IHNlcnZpY2VzIHBsZWFzZSBzZW5kIHRoZSBwYWNrYWdlIHRvIHN1cHBvcnRcQG90cnMuY29tIG9yIGNhbGxcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAib3VyIHN1cHBvcnQgdGVhbSBieSBwaG9uZSB0byByZXZpZXcgdGhlIG5leHQgc3RlcC5cblxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICJZb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBPVFJTIHN1cHBvcnQgb3IgZmFjZS10by1mYWNlIGNvbnRhY3QgaW5mb3JtYXRpb24gYXRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAnaHR0cDovL3d3dy5vdHJzLmNvbS8nIC4gIlxuXG4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlIGJ1dHRvbiBkb3dubG9hZCBiZWNvbWVzIHRoZSBzdWJtaXQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgKCAkQ29udGVudCwgJEZpbGVuYW1lICkgPSAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5Eb3dubG9hZCgKICAgICAgICAgICAgICAgICVDdXN0b21lckluZm8sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJldHVybiBmaWxlCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JENvbnRlbnR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaGVkJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBTUUwgYmVuY2ggSW5pdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdCZW5jaG1hcmtTUUxJbml0JyApIHsKCiAgICAgICAgIyBzZWxlY3Rpb24gZGF0YSBmb3IgYmVuY2htYXJrIGRyb3Bkb3duIGxpc3QKICAgICAgICBteSAlU2VsZWN0aW9uRGF0YSA9ICgKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxICogTm9ybWFsIChjYS4gMjUgc2VjKScsCiAgICAgICAgICAgICAgICAzID0+ICczICogSGlnaCAgIChjYS4gNzUgc2VjKScsCiAgICAgICAgICAgICAgICA1ID0+ICc1ICogSGVhdnkgIChjYS4gMTI1IHNlYyknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOYW1lID0+ICdNb2RlJywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIExheW91dCBvYmplY3Qga25vd3MgdGhlIGZ1bmN0aW9uIEJ1aWxkU2VsZWN0aW9uCiAgICAgICAgIyB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9sZGVyIG90cnMgdmVyc2lvbnMgdXNlIE9wdGlvblN0cmdIYXNoUmVmIGluc3RlYWQKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Y2FuKCdCdWlsZFNlbGVjdGlvbicpICkgewoKICAgICAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gZm9yIGJlbmNobWFyayB0ZXN0CiAgICAgICAgICAgICRQYXJhbXtNb2RlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKCVTZWxlY3Rpb25EYXRhKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBmb3IgYmVuY2htYXJrIHRlc3QKICAgICAgICAgICAgJFBhcmFte01vZGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoJVNlbGVjdGlvbkRhdGEpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0SW5pdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTW9kZVN0cmcgPT4gJFBhcmFte01vZGVTdHJnfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFNRTCBiZW5jaAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdCZW5jaG1hcmtTUUwnICkgewoKICAgICAgICBteSAkSW5zZXJ0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnSW5zZXJ0JyApIHx8IDEwMDAwOwogICAgICAgIG15ICRVcGRhdGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdVcGRhdGUnICkgfHwgMTAwMDA7CiAgICAgICAgbXkgJFNlbGVjdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdCcgKSB8fCAxMDAwMDsKICAgICAgICBteSAkTW9kZSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTW9kZScgKTsKCiAgICAgICAgbXkgJU1vb2QgPSAoICdGaW5lJywgJzotKScsICdPaycsICc6LXwnLCAnV3JvbmcnLCAnOi0oJyApOwoKICAgICAgICBteSAlQmVuY2hUZXN0ID0gJFNlbGYtPntTdXBwb3J0T2JqZWN0fS0+QmVuY2htYXJrKAogICAgICAgICAgICBJbnNlcnQgPT4gJEluc2VydCwKICAgICAgICAgICAgVXBkYXRlID0+ICRVcGRhdGUsCiAgICAgICAgICAgIFNlbGVjdCA9PiAkU2VsZWN0LAogICAgICAgICAgICBNb2RlICAgPT4gJE1vZGUsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlQmVuY2hUZXN0LAogICAgICAgICAgICAgICAgSGVhZCA9PiAnU1FMJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIEluc2VydAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0luc2VydCBUaW1lJywKICAgICAgICAgICAgICAgIFRpbWUgID0+ICRCZW5jaFRlc3R7SW5zZXJ0VGltZX0sCiAgICAgICAgICAgICAgICBNb29kICA9PiAkTW9vZHsgJEJlbmNoVGVzdHtJbnNlcnRSZXN1bHR9IH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAoICRJbnNlcnQgKiAkTW9kZSApLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0Um93JyAuICRCZW5jaFRlc3R7SW5zZXJ0UmVzdWx0fSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTaG91bGRUYWtlID0+ICRCZW5jaFRlc3R7SW5zZXJ0U2hvdWxkVGFrZX0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBVcGRhdGUKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdVcGRhdGUgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lICA9PiAkQmVuY2hUZXN0e1VwZGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgTW9vZCAgPT4gJE1vb2R7ICRCZW5jaFRlc3R7VXBkYXRlUmVzdWx0fSB9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gKCAkVXBkYXRlICogJE1vZGUgKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycgLiAkQmVuY2hUZXN0e1VwZGF0ZVJlc3VsdH0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2hvdWxkVGFrZSA9PiAkQmVuY2hUZXN0e1VwZGF0ZVNob3VsZFRha2V9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgVGltZQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1NlbGVjdCBUaW1lJywKICAgICAgICAgICAgICAgIFRpbWUgID0+ICRCZW5jaFRlc3R7U2VsZWN0VGltZX0sCiAgICAgICAgICAgICAgICBNb29kICA9PiAkTW9vZHsgJEJlbmNoVGVzdHtTZWxlY3RSZXN1bHR9IH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAoICRTZWxlY3QgKiAkTW9kZSApLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0Um93JyAuICRCZW5jaFRlc3R7U2VsZWN0UmVzdWx0fSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTaG91bGRUYWtlID0+ICRCZW5jaFRlc3R7U2VsZWN0U2hvdWxkVGFrZX0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdEZWxldGUgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lICA9PiAkQmVuY2hUZXN0e0RlbGV0ZVRpbWV9LAogICAgICAgICAgICAgICAgTW9vZCAgPT4gJE1vb2R7ICRCZW5jaFRlc3R7RGVsZXRlUmVzdWx0fSB9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gKCAkSW5zZXJ0ICogJE1vZGUgKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycgLiAkQmVuY2hUZXN0e0RlbGV0ZVJlc3VsdH0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2hvdWxkVGFrZSA9PiAkQmVuY2hUZXN0e0RlbGV0ZVNob3VsZFRha2V9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ011bHRpcGxpZXInLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gIiogJE1vZGUiLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU3VwcG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJUJlbmNoVGVzdCwKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgcmVzdWx0IG9mIGFsbCBhZG1pbiBjaGVja3MKICAgICAgICBteSAkRGF0YUhhc2ggPSAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5BZG1pbkNoZWNrc0dldCgpOwoKICAgICAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyREYXRhSGFzaH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld01vZHVsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBST1dIQVNIOgogICAgICAgICAgICBmb3IgbXkgJFJvd0hhc2ggKCBAeyAkRGF0YUhhc2gtPnskTW9kdWxlfSB9ICkgewoKICAgICAgICAgICAgICAgIG5leHQgUk9XSEFTSCBpZiAoICEleyRSb3dIYXNofSApOwoKICAgICAgICAgICAgICAgICRSb3dIYXNoLT57QmxvY2tTdHlsZX0gPSAkUm93SGFzaC0+e0Jsb2NrU3R5bGV9IHx8ICcnOwoKICAgICAgICAgICAgICAgIGlmICggJFJvd0hhc2gtPntCbG9ja1N0eWxlfSBuZSAnVGFibGVEYXRhU2ltcGxlJyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGJsb2NrIHdpdGggcm90YXRvcnkgY3NzCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdNb2R1bGVSb3cnIC4gJFJvd0hhc2gtPntCbG9ja1N0eWxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRSb3dIYXNofSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdNb2R1bGVSb3dUYWJsZURhdGFTaW1wbGUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFJvd0hhc2h9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJVRhYmxlVmFsdWVzID0gc3BsaXQoIC9bPTtdLywgJFJvd0hhc2gtPntUYWJsZUluZm99ICk7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVUYWJsZVZhbHVlcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TW9kdWxlVGFibGVSb3cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUtleSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICRUYWJsZVZhbHVlc3skSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU3VwcG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7fSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFN1cHBvcnQueG1sLHYgMS4xMy4yLjEgMjAxMi8wNy8yNSAxMzozMjowMCBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluU3VwcG9ydCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pblN5c3RlbVN0YXR1cyBvYmplY3QgaW4gdGhlIGFkbWluIGFyZWEuPC9EZXNjcmlwdGlvbj5EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZG1pblN5c3RlbVN0YXR1cy1PYmpla3RzIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj5EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPFRpdGxlPlN1cHBvcnQgSW5mbzwvVGl0bGU+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluLVN1cHBvcnQgT3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U3VwcG9ydCBBc3Nlc3NtZW50PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5TeXN0ZW08L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgIDxMb2FkZXI+CiAgICAgICAgICAgICAgICAgICAgPENTUz5TdXBwb3J0LkRlZmF1bHQuY3NzPC9DU1M+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpTZW5kZXJFbWFpbCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSB1c2VkIHNlbmRlciBtYWlsIGFkZHJlc3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSB2ZXJ3ZW5kZXRlIEFic2VuZGVyYWRyZXNzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6OkRCMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIERCMiBkYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBmw7xyIGRpZSBEQjIgRGF0ZW5iYW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1cnJlbnRUaW1lc3RhbXBDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cHBvcnQ6OkRhdGFiYXNlOjpNU1NRTCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIE1TU1FMIGRhdGFiYXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBEYXRlbmJhbmstQ2hlY2tzIGbDvHIgZGllIE1TU1FMIERhdGVuYmFuay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXJyZW50VGltZXN0YW1wQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlZlcnNpb25DaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGF0YWJhc2VTaXplQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGFiYXNlSG9zdG5hbWVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cHBvcnQ6OkRhdGFiYXNlOjpNeVNRTCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIE15U1FMIGRhdGFiYXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBEYXRlbmJhbmstQ2hlY2tzIGbDvHIgZGllIE15U1FMIERhdGVuYmFuay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXhBbGxvd2VkUGFja2FnZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJRdWVyeUNhY2hlU2l6ZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4U3VwcG9ydENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4Q2xpZW50Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVURjhEYXRhYmFzZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4VGFibGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWZXJzaW9uQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGFiYXNlU2l6ZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6Ok9yYWNsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIE9yYWNsZSBkYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBmw7xyIGRpZSBPcmFjbGUgRGF0ZW5iYW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5MU0RhdGVGb3JtYXRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT3JhY2xlSG9tZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOTFNMYW5nQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5MU0RhdGVGb3JtYXRTZWxlY3RDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6OlBvc3RncmVTUUwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIHRoZSBkYXRhYmFzZSBjaGVja3MgZm9yIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBEYXRlbmJhbmstQ2hlY2tzIGbDvHIgZGllIFBvc3RncmVTUUwgRGF0ZW5iYW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGVTdHlsZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4U2VydmVyQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVURjhDbGllbnRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWZXJzaW9uQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpPUyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIE9wZXJhdGluZyBTeXN0ZW0gY2hlY2tzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBCZXRyaWVic3N5c3RlbS1DaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1BVTG9hZENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaXNrVXNhZ2VDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWVtb3J5U3dhcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaXN0cmlidXRpb25DaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2VybmVsSW5mb0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQZXJsQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBlcmxNb2R1bGVzQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpPVFJTIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgT1RSUyBjaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIE9UUlMtQ2hlY2tzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9wZW5UaWNrZXRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0SW5kZXhNb2R1bGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0U3RhdGljREJPcnBoYW5lZFJlY29yZHMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpY2tldEZ1bGx0ZXh0SW5kZXhNb2R1bGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRlFETkNvbmZpZ0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTeXN0ZW1JRENvbmZpZ0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMb2dDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRmlsZVN5c3RlbUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQYWNrYWdlRGVwbG95Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb25maWdDaGVja1RpY2tldEZyb250ZW5kUmVzcG9uc2VGb3JtYXQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRVc2VyQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRTT0FQVXNlckNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHZW5lcmFsU3lzdGVtT3ZlcnZpZXciPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpXZWJzZXJ2ZXI6OkFwYWNoZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIHdlYnNlcnZlciBjaGVja3MgZm9yIHRoZSBBcGFjaGUgd2Vic2VydmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBXZWJzZXJ2ZXItQ2hlY2tzIGbDvHIgZGVuIEFwYWNoZSBXZWJzZXJ2ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBhY2hlVmVyc2lvbkNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDR0lBY2NlbGVyYXRvckNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcGFjaGVEQklDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBhY2hlUmVsb2FkQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpXZWJzZXJ2ZXI6OklJUyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIHdlYnNlcnZlciBjaGVja3MgZm9yIHRoZSBJSVMgd2Vic2VydmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBXZWJzZXJ2ZXItQ2hlY2tzIGbDvHIgZGVuIElJUyBXZWJzZXJ2ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGVybEV4Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpDcm9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgQ3JvbiBjaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIENyb24tQ2hlY2tzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEB2ZXJzaW9uICAgICAkUmV2aXNpb246IDEuNSAkCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCi8qKgogKiBAcGFja2FnZSAgICAgU3VwcG9ydAogKiBAc2VjdGlvbiAgICAgR2VuZXJhbAogKi8KCi5BZG1pblN1cHBvcnQgLkNoZWNrUmVzdWx0IHsKICAgIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgI2FhYTsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCi5BZG1pblN1cHBvcnQgLkNoZWNrUmVzdWx0ID4gcCB7CiAgICBwYWRkaW5nOiAwIDAgMXB4IDM1cHg7Cn0KCi5BZG1pblN1cHBvcnQgLkNoZWNrUmVzdWx0T0sgPiBwIHsKICAgIGNvbG9yOiAjODg4Owp9CgouQWRtaW5TdXBwb3J0IC5DaGVja1Jlc3VsdE9LOmhvdmVyID4gcCB7CiAgICBjb2xvcjogIzAwMDsKfQovKioKICogQHN1YnNlY3Rpb24gIEZsYWcKICovCi5BZG1pblN1cHBvcnQgLkZsYWcgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltZy9mbGFnX3NoYWRvdy5wbmcpIG5vLXJlcGVhdCBzY3JvbGwgMCAwOwogICAgaGVpZ2h0OiAxOHB4OwogICAgd2lkdGg6IDI0cHg7CiAgICBmbG9hdDogbGVmdDsKICAgIG1hcmdpbjogMnB4IDEwcHggMCAwOwp9CgouQWRtaW5TdXBwb3J0IC5GbGFnLlNtYWxsIHsKICAgIHdpZHRoOiAxN3B4OwogICAgaGVpZ2h0OiAxMHB4OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogYm90dG9tIHJpZ2h0Owp9CgouQWRtaW5TdXBwb3J0IC5GbGFnIHNwYW4gewogICAgZGlzcGxheTogYmxvY2s7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIHRleHQtaW5kZW50OiAtOTk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgLyogc2V0IGEgZGVmYXVsdCBjb2xvciBmb3IgcHJpb3JpdGllcyAqLwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NkY2RjZDsKfQoKLkFkbWluU3VwcG9ydCAuRmxhZy5TbWFsbCBzcGFuIHsKICAgIGhlaWdodDogOHB4Owp9CgouQWRtaW5TdXBwb3J0IC5DaGVja1Jlc3VsdE9LIC5GbGFnIHNwYW4gewogICAgYmFja2dyb3VuZC1jb2xvcjogIzAwODAwMDsKfQoKLkFkbWluU3VwcG9ydCAuQ2hlY2tSZXN1bHRGYWlsZWQgLkZsYWcgc3BhbiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYwMDAwOwp9CgouQWRtaW5TdXBwb3J0IC5DaGVja1Jlc3VsdENyaXRpY2FsIC5GbGFnIHNwYW4gewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYTAwMDsKfQoKLkFkbWluU3VwcG9ydCAuQ2hlY2tSZXN1bHRDcml0aWNhbCAuRmxhZyBzcGFuIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmEwMDA7Cn0KCgp9IC8qIGVuZCBAbWVkaWEgKi8=